2017-06-08 15 views
1

辞書のリストを検証するシリアライザを作成するにはどうすればよいですか?送信されてDRFシリアライザを使用して辞書のリストを確認する

サンプルペイロードがある:

this SO answerthisから撮影
"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 

、私はserializer.dataを使用してペイロードにpayment_discountオブジェクトへのアクセスを得ることができますが、残念ながらたとえば、辞書に対して検証が行われていない場合& djangorestframeworkは==私はあなたがあなたのシリアライザを簡素化することができると思い3.5.1

答えて

2

... はテストしていません1.10.2 Djangoの==:ペイロードは、そのdiscount_earned値ではない使用して

小数点型である含みそれはあなたのようなものを使用することができます:

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を参照してください。

関連する問題