Как сгенерировать serializer.error в Django? - PullRequest
0 голосов
/ 13 февраля 2020

Как мне выкинуть serializer.errors, если у меня неправильный ввод в каком-то поле? Нужно ли мне кодировать некоторые «logi c», или мне просто нужно написать несколько «конфигураций».

#models.py
class Product(models.Model):
    name = models.CharField()
    amount = models.IntegerField()
    description = models.TextField()

#serializers.py
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'
    def create(self, validated_data):
        ...
    def update(self, instance, validated_data):
        ...

#views.py
class ProductViewSet(viewsets.ModelViewSet):
    serializer_class = ProductSerializer

    def partial_update(self, request, pk=None):
        ...

    def get_queryset(self):
        ...

Например, я хочу POST:

{
"name": "Banana",
"amount": "ABCD",
"description": ""
}

Вместо получения ошибки на сервере:

ValueError: invalid literal for int() with base 10: 'ABCD'

Я хочу получить ответ, подобный этому:

{"amount": ["A valid integer is required."], "description": ["This field may not be blank."]}

1 Ответ

1 голос
/ 13 февраля 2020

Что касается модели, modelserializer позаботится. Если вам нужен больший контроль валидации в вашей руке, тогда вы можете сделать это в своем serializers. Для вашей проблемы подойдут следующие фрагменты.

#serializers.py

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

    def create(self, validated_data):
        ...

    def update(self, instance, validated_data):
        ...

    def validate(self, attrs):
        # you can add your validation rule here 
        if not isinstance(attrs.get('amount'), int):
            serializers.ValidationError({
                "amount": ["A valid integer is required."],
                "description": ["This field may not be blank."]
            })

Таким образом, вы можете использовать validate() для проверки любого поля вашего сериализатора во время sh. Официальная документация по валидатору в сериализаторе , также вы можете использовать функцию validate_<field_name>(self, <field_name>) для проверки указанного поля c сериализатора. Как упомянуто в этом ответе .

...