【问题标题】:How to throw back serializer.errors in Django?如何在 Django 中返回 serializer.errors?
【发布时间】:2020-02-13 07:27:48
【问题描述】:

如果我在某些字段中输入错误,我该如何抛出serializer.errors?我是必须编写一些“逻辑”,还是只需要编写一些“配置”。

#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):
        ...

例如我想发帖:

{
"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."]}

【问题讨论】:

  • 根据模型结构,DRF 将负责基本验证。如果您想要更详细的验证,请使用 validate() 方法
  • 如何“配置”基本验证?怎么不还给我?
  • 我的视图中没有def create()
  • 你的观点看起来不错,你能添加完整的错误回溯吗?
  • 这是一个错误,因为我没有 IntegerField() 的有效输入

标签: django django-rest-framework


【解决方案1】:

就模型的设计而言,modelserializer 将负责。如果您想要更多地控制自己的验证,那么您可以在serializers 中进行。对于您的问题,以下 sn-ps 将起作用。

#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() 来验证序列化程序的任何字段。 Official documentation on validator in serializer,您也可以使用validate_<field_name>(self, <field_name>) 函数来验证序列化程序的特定字段。就像这个answer中提到的一样。

【讨论】:

  • 如何“激活”“默认”验证?
  • 默认验证将在您使用model serializer 时默认进入操作。通过显式定义validate(),您可以为序列化器的字段添加额外的验证。
  • 当我通过str 例如IntegerField()。我在服务器中收到错误,并且没有发回任何响应...
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2011-05-20
  • 2021-08-18
  • 2020-11-06
  • 2021-09-11
  • 1970-01-01
  • 2017-02-07
  • 2019-05-24
相关资源
最近更新 更多