使用DRF序列化程序验证字典列表

luk*_*kik 1 django django-rest-framework

我该如何编写验证字典列表的序列化程序?

发送的有效负载样本为:

"payment_discount": [
    {
        "discount_rule_id": 1,
        "discount_rule_name": "10 day early payment",
        "discount_earned": "298.00"
    },
    {
        "discount_rule_id": 2,
        "discount_rule_name": "Store discount",
        "discount_earned": "5.50"
    },
]
Run Code Online (Sandbox Code Playgroud)

这个答案这个

class PaymentDiscountSerializer(serializers.DictField):

    discount_rule_id = serializers.IntegerField(required=False)
    discount_rule_name = serializers.CharField(max_length=50)
    discount_earned = serializers.DecimalField(max_digits=10, decimal_places=3)

class PaymentDiscountListSerializer(serializers.ListField):
    """Serialize discount object"""
    child = PaymentDiscountSerializer()

class PaymentSerializer(serializers.ModelSerializer):
    payment_discount = PaymentDiscountListSerializer()
    # Other model fields
Run Code Online (Sandbox Code Playgroud)

这样,我可以使用serializer.data来访问有效负载中的payment_discount对象,但是不幸的是,如果例如有效负载包括非十进制类型的Discount_earned值,则不会对字典进行验证

使用:Django == 1.10.2&djangorestframework == 3.5.1

F. *_*ron 6

我认为您可以简化序列化器...尚未测试过,但可以使用以下方法:

class PaymentDiscountSerializer(serializers.Serializer):
    """Serialize discounts"""
    discount_rule_id = serializers.IntegerField(required=False)
    discount_rule_name = serializers.CharField(max_length=50)
    discount_earned = serializers.DecimalField(max_digits=10, decimal_places=3)

class PaymentSerializer(serializers.ModelSerializer):
    payment_discount = PaymentDiscountSerializer(many=True)
    # Other model fields
Run Code Online (Sandbox Code Playgroud)

它应该为您提供所需的对象列表。

为了进行验证,它应该像这样开箱即用。

但是,我还没有测试过。如果验证存在问题,则可以定义自己的验证。例:

class PaymentDiscountSerializer(serializers.Serializer):
    """Serialize discounts"""
    discount_rule_id = serializers.IntegerField(required=False)
    discount_rule_name = serializers.CharField(max_length=50)
    discount_earned = serializers.DecimalField(max_digits=10, decimal_places=3)

    def validate_discount_rule_id(self, value):
        # Validation logic of the discount_rule_id field
        #
        return value

    def validate(self, attrs):
        # Validation logic of all the fields
        #
        return attrs
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见http://www.django-rest-framework.org/api-guide/serializers/#field-level-validation