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
相关产品推荐
相关产品推荐

