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

Django 使用DRF序列化程序验证字典列表,django,django-rest-framework,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_nam

如何编写序列化程序来验证字典列表

正在发送的示例有效负载为:

"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"
    },
]
取自和:

这样,我可以使用serializer.data访问有效负载中的payment_折扣对象,但不幸的是,如果有效负载包含的折扣挣得值不是Decimal类型,则不会对字典进行验证


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

我认为您可以简化序列化程序。。。 尚未测试,但您可以使用以下内容:

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
它应该给你一个你想要的对象列表

对于验证,它应该像这样开箱即用

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

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
有关更多信息,请参阅

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