You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest API序列化器未正确序列化多对多字段问题

问题:OrderProdSerializer序列化时忽略quantity、date字段

使用Django REST Framework序列化Order模型时,嵌套的OrderProdSerializer仅返回id、product_name、product_price字段,quantity和date字段被忽略,未出现在返回结果中。

模型代码

class Product(models.Model):
    ...
    name  = models.CharField(max_length=100, blank=True, null=True)
    price = models.DecimalField(max_digits=6,decimal_places=2)
    ...
  
class Order(models.Model):
    user    = models.ForeignKey("main.User", on_delete=models.CASCADE)
    details = models.ManyToManyField(Product, through="OrderProd")
    ...
    
    
class OrderProd(models.Model):
    product  = models.ForeignKey(Product, on_delete=models.CASCADE)
    order    = models.ForeignKey(Order  ,  on_delete=models.CASCADE)
    quantity = models.IntegerField(default=0)
    date     = models.DateTimeField(default=timezone.now)

原序列化器代码

class OrderProdSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField( source='name')
    product_price= serializers.DecimalField(max_digits=20,decimal_places=2,source='price')
    class Meta:
        model=OrderProd
        fields=["id","product_name","quantity","product_price","date"]
        read_only_fields = ('id',)
  
  
      
class OrderSerializer(serializers.ModelSerializer):
    details = OrderProdSerializer(many=True)
    class Meta:
        model=Order
        fields=["id","details","created_date","order_date"]
        read_only_fields = ('id', )

实际返回结果

[
    {
        "id": 1,
        "details": [
            {
                "id": 1,
                "product_name": "t-shirt",
                "product_price": "20.00",
            }
        ],
        "created_date": "2023-07-25T17:34:45Z",
        "order_date": null
    }
]

期望返回结果

[
    {
        "id": 1,
        "details": [
            {
                "id": 1,
                "product_name": "t-shirt",
                "product_price": "20.00",
                "quantity": 2 ,
                "date": "2023-07-25"
            }
        ],
        "created_date": "2023-07-25T17:34:45Z",
        "order_date": null
    }
]

解决方法

问题根源在OrderProdSerializer的自定义字段source参数错误:OrderProd模型本身不存在name和price字段,这两个字段属于关联的Product模型,因此需要将source改为product.name和product.price。

修正后的OrderProdSerializer代码:

class OrderProdSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField(source='product.name')
    product_price = serializers.DecimalField(max_digits=20, decimal_places=2, source='product.price')
    class Meta:
        model=OrderProd
        fields=["id","product_name","quantity","product_price","date"]
        read_only_fields = ('id',)

修改后,序列化器可正确解析关联模型的字段,同时正常序列化OrderProd自身的quantity和date字段,返回结果将符合预期。

内容的提问来源于stack exchange,提问作者B A.J Amar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:27:38