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

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -