Django дополнительная валидация в serializer
Есть модель Books
class Books(models.Model):
name = models.TextField(blank=False, null=False)
price = models.FloatField(blank=True, null=True)
is_available = models.BoleanField(blank=False, null=False, default=True)
is_selling = models.IntegerField(blank=False, null=False)
Сериалайзер
class BooksSerializers(serializers.ModelSerializer):
class Meta:
model = Books
fields = [
'name',
'price',
'is_available',
'is_selling',
]
validators = [
RequiredValidator(
fields=('price')
)
]
Подскажите, а как сделать так, что бы validators на цену срабатывал только тогда, когда is_selling = 1.
Ответы (1 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
Не проверено, но если верить докам, то примерно так
class BooksSerializers(serializers.ModelSerializer):
...
def validate(self, data):
if data['is_selling'] != 1:
raise serializers.ValidationError("Цэ заборонено")
return data
Добавлю. В доках DRF значится
In DRF, serializer validation is run in a specific, undocumented order
Field deserialization called (serializer.to_internal_value and field.run_validators)
serializer.validate_[field] is called for each field.
Serializer-level validators are called (serializer.run_validation followed by serializer.run_validators)
Finally, serializer.validate is called to complete validation.
Поэтому валидацию цены придется реализовывать самому в validate() или в validate_price