/ / Използване на DRF сериализатор за валидиране на списък с речници - django, django-rest-frame

Използване на DRF сериализатор за валидиране на списък с речници - django, django-rest-frame

Как да напиша сериализатор, който потвърждава списък на речниците?

Изпраща се примерния полезен товар:

"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"
},
]

Като взема от този отговор и това:

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

С това мога да получа достъп дообект Payment_discount в полезния товар, използвайки serializer.data, но за съжаление не се правят валидации срещу речника, ако напр. полезният товар включва стойността на отстъпката, която не е от тип Decimal

използвайки: Django == 1.10.2 & djangorestframework == 3.5.1

Отговори:

2 за отговор № 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

виждам http://www.django-rest-framework.org/api-guide/serializers/#field-level-validation за повече информация.