Как да напиша сериализатор, който потвърждава списък на речниците?
Изпраща се примерния полезен товар:
"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 за повече информация.