Django REST Framework custom fields validation -
i trying create custom validation model, check start_date
before end_date
, proving near impossible.
stuff i've tried:
built-in django validators: none check this
writing own, so:
def validate_date(self): if self.start_date < self.end_date: raise serializers.validationerror("end date must after start date.")
that bit of code have added serializer class (and model), not seem called in either location.
i found this bit of code might of use, don't know how integrate in method- seems work validate 1 model attribute, need check between 2 attributes.
my model:
class mymodel(models.model): created = models.datetimefield(auto_now_add=true) relation_model = models.foreignkey(relationmodel, related_name="mymodels") priority = models.integerfield( validators = [validators.minvaluevalidator(0), validators.maxvaluevalidator(100)]) start_date = models.datefield() end_date = models.datefield() @property def is_active(self): today = datetime.date.today() return (today >= self.start_date) , (today <= self.end_date) def __unicode__(self): ... class meta: unique_together = ('relation_model', 'priority', 'start_date', 'end_date')
fyi, other validations work!
my serializer:
class mymodelserializer(serializers.modelserializer): relation_model = relationmodelserializer is_active = serializers.field(source='is_active') def validate_date(self): if self.start_date > self.end_date: raise serializers.validationerror("end date must after start date.") class meta: model = mymodel fields = ( 'id', 'relation_model', 'priority', 'start_date', 'end_date', 'is_active' )
my view:
class mymodellist(generics.listcreateapiview): permission_classes = (isadminuser,) queryset = mymodel.objects.all() serializer_class = mymodelserializer ordering = ('priority')
you should use object wide validation (validate()
), since validate_date
never called since date
not field on serializer. from documentation:
class myserializer(serializers.modelserializer): def validate(self, data): """ check start before stop. """ if data['start_date'] > data['end_date']: raise serializers.validationerror("finish must occur after start") return data
pre drf 3.0 add clean function of model, not called anymore in drf 3.0.
class mymodel(models.model): start_date = models.datefield() end_date = models.datefield() def clean(self): if self.end_date < self.start_date: raise validationerror("end date must after start date.")
Comments
Post a Comment