2016-10-01 7 views
1

私は、セールス/クーポンを販売するウェブサイトに取り組んでいます。私は以下のモデルを持っています(余分な詳細を除く)。これらのためのdjango rest frameworkの逆ネストされたリレーションシップシリアライゼーション

class Order(models.Model): 

     email = models.EmailField(max_length=200, null=False) 
     phone_number = models.CharField(max_length=10, null=False) 
     shipping_address = models.TextField(blank=True,null=True) 
     coupon_code = models.CharField(max_length=20,null=True,blank=True) 
     gross_total = models.FloatField(default=0.0) 

     class Meta: 
      db_table = 'order' 


    class OrderDetail(models.Model): 
     order = models.ForeignKey(Order,related_name='order_details') 
     package = models.ForeignKey(Package) 
     quantity = models.IntegerField(null=False) 
     unit_price = models.FloatField(default=0.0) 

     class Meta: 
      db_table = 'order_detail' 




    class Coupon(models.Model): 
     order_detail = models.ForeignKey(OrderDetail,related_name='coupons') 
     code = models.CharField(max_length=200, null=False, unique=True) 
     maximum_usage_count = models.IntegerField(null=False) 
     used_count = models.IntegerField(default=0) 
     valid_from = models.DateTimeField(null=False) 
     valid_to = models.DateTimeField(null=False) 

     class Meta: 
      db_table = 'coupon' 

私のシリアライザは、私のlistapiviewで

class CouponSerializer(serializers.Serializer): 
     class Meta: 
      model = Coupon 
      fields = ['id', 'code', 'maximum_usage_count', 'used_count', 'valid_from', 'valid_to', 'created_at', 
         'updated_at', 'is_active'] 


    class OrderDetailSerializer(serializers.Serializer): 
     coupons = CouponSerializer(read_only=True) 

     class Meta: 
      model = OrderDetail 
      fields = ['id', 'package', 'quantity', 'unit_price', 'created_at', 'updated_at', 'is_active'] 


    class OrderSerializer(serializers.ModelSerializer): 
     order_details = OrderDetailSerializer(read_only=True,many=True) 

     class Meta: 
      model = Order 
      fields = ['id','email', 'phone_number', 'shipping_address', 'coupon_code', 'gross_total','order_details'] 

は、すべての注文をフェッチするために、私は注文シリアライザを指定しているされています。 APIは正常に動作していますが、リバースリレーションシップモデルをシリアル化することはできません。私は次の応答を得ています。あなたはOrderSerializerでやったように -

{ 
      "id": 31, 
      "email": "[email protected]", 
      "first_name": "ff", 
      "last_name": "ff", 
      "phone_number": "ff", 
      "shipping_address": "", 
      "coupon_code": "", 
      "gross_total": 1.0, 
      "payment_method": "ONLINE", 
      "order_status": "PLACED", 
      "created_at": "2016-10-01T17:26:00.432000", 
      "updated_at": "2016-10-01T17:48:50.797000", 
      "is_active": true, 
      "order_details": [ 
       { 
        "coupons": {} 
       }, 
       { 
        "coupons": {} 
       }, 
       { 
        "coupons": {} 
       } 
      ] 
     } 

答えて

0

私はあなただけではなく、serializer.SerializerCouponSerializerserializers.ModelSerializerOrderDetailSerializerを継承したクラスを置き換えるべきだと思います。

あなたのモデル(CouponとOrderDetail)がcreated_at,updated_atis_activeのいずれのフィールドも宣言していないため、エラーが発生します。したがって、これらのフィールドをモデルに追加するか、両方のシリアライザクラスのMetaのリストから削除する必要があります。しかしその後、それは期待どおりに動作します。