django rest framework serializers and django forms

django, django-rest-framework, python

Solution

You can use your serializer to deserialize and validate the data inside the `is_valid` method of your form.

class MyModelForm(ModelForm):
    def is_valid(self):
        # Call super's is_valid to populate cleaned_data and do basic field validation
        valid = super(MyModelForm, self).is_valid()
        if not valid:
            return False

        serializer = MyModelSerializer(data=self.cleaned_data)
        return serializer.is_valid()

Problem

Question: How to write DRY code for field validation in both form and serializer? Example: I have simple django app with model form, which validates `passengers` field for `Order`: ``` def clean_passengers(self): passengers = self.cleaned_data['passengers'] if passengers > self.flight.available_seats: raise forms.ValidationError( _(u'''Passengers count can`t be greater then seats count''')) return passengers ``` And same code for validation in `Order` serializer: ``` def validate_passengers(self, attrs, source): passengers = attrs[source] if passengers > self.flight.available_seats: raise serializers.ValidationError( _(u'''Passengers count can`t be greater then seats count''')) return attrs ``` This isn`t DRY and I have write same logic twice. How I can avoid this? Maybe I can inherit serializer from form or something like this.

Original source