【问题标题】:What is the order of execution of validations in DRF serializers?DRF 序列化程序中验证的执行顺序是什么?
【发布时间】:2020-08-26 08:45:37
【问题描述】:

我无法理解在序列化程序上执行验证的顺序。

这是我的序列化程序之一:

class InvoiceCreateSerializer(serializers.ModelSerializer):
    buyer_company = serializers.PrimaryKeyRelatedField(
        queryset=CompanyModel.objects.filter(is_archived=False)
    )
    order = serializers.PrimaryKeyRelatedField(
        queryset=OrderModel.objects.filter(
            is_archived=False
        )
    )
    shipping_address = serializers.PrimaryKeyRelatedField(
        queryset=AddressModel.objects.filter(
            address_type=ADDRESS_TYPE[1][0]
        )
    )

    def validate_buyer_company(self, buyer_company):
        # validation for buyer company
        return buyer_company

    def validate_shipping_address(self, shipping_address):
        # validtion for shipping address which require buyer company from request data
        return shipping_address

    def validate(self, attrs):
        # validations for extra fields

        return attrs

    class Meta:
        model = InvoiceModel
        fields = '__all__'

这是我的发票模型:

class InvoiceModel(BaseModel):
    # relative fields
    buyer_company = models.ForeignKey(
        CompanyModel, on_delete=models.PROTECT,
        related_name='invoice_buyer_company'
    )
    seller_company = models.ForeignKey(
        CompanyModel, on_delete=models.PROTECT,
        related_name='invoice_seller_company'
    )
    seller_warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.PROTECT,
        related_name='invoice_seller_warehouse'
    )
    shipping_address = models.ForeignKey(
        AddressModel, on_delete=models.PROTECT,
        related_name='invoice_shipping_address'
    )
    ...


现在,如果我的请求数据中不存在买方公司,它应该为必填字段引发框架验证错误。但相反,它继续进行,并且由于我的 validate_shipping_address 需要买方公司,它给出了一个关键错误。 如何事先验证必填字段,然后执行自定义字段验证?

【问题讨论】:

  • 请出示您的models.py文件
  • 我已经添加了模型
  • 我已经添加了答案here

标签: django-rest-framework django-serializer


【解决方案1】:
方法一:
class InvoiceCreateSerializer(serializers.ModelSerializer):
    buyer_company = serializers.PrimaryKeyRelatedField(
        queryset=CompanyModel.objects.filter(is_archived=False)
    )

     def validate_buyer_company(self, buyer_company):
        created_count = CompanyModel.objects.filter(buyer_company=self.context['request'].id).count()
        min_count = 1
        if created_count < min_count :
            raise serializers.ValidationError("buyer company ID should present in Invoice data")
        return buyer_company


    class Meta:
        model = InvoiceModel
        fields = '__all__'


替代方法:
from django.db.models import Q

class InvoiceCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = InvoiceModel
        fields = '__all__'

    def validate(self, data):
        _id = data['id']
        queryset = InvoiceModel.objects.filter(Q(buyer_company__id__iexact=_id)).distinct()

        if not queryset.exists():
            raise serializers.ValidationError("buyer company ID should present in Invoice data")
        return buyer_company

【讨论】:

  • 这似乎是一个有效的答案,但我想知道的是为什么序列化程序没有引发字段必需的错误。从逻辑上讲,它应该首先检查该验证,然后继续
猜你喜欢
  • 1970-01-01
  • 2018-08-22
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多