【问题标题】:Reverse Nested Relationship Serialization in django rest frameworkdjango rest框架中的反向嵌套关系序列化
【发布时间】:2017-02-09 22:20:18
【问题描述】:

我正在开发一个交易/优惠券销售网站。我有以下型号,(不包括额外的细节)。

    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'

我的序列化器是,

    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']

在我的 listapiview 中,为了获取所有订单,我指定了订单序列化程序。该 api 工作正常,但无法序列化反向关系模型。我收到以下回复。

{
            "id": 31,
            "email": "ff@b.com",
            "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": {}
                }
            ]
        }

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    我认为你应该在CouponSerializerOrderDetailSerializer 中用serializers.ModelSerializer 替换继承的类,而不仅仅是serializer.Serializer - 就像你在OrderSerializer 中所做的那样。

    之后您会收到一些错误,因为您的模型(Coupon 和 OrderDetail)没有声明任何 created_atupdated_atis_active 字段。因此,您应该将这些字段添加到您的模型中,或者从两个序列化程序类的Meta 列表中删除它们。但之后它按预期工作。

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 2021-06-23
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2014-09-18
      • 2019-12-23
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多