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.