在 Django Rest Framework 中序列化多对多中间表
Posted
技术标签:
【中文标题】在 Django Rest Framework 中序列化多对多中间表【英文标题】:Serializing Many To Many intermediate table in Django Rest Framework 【发布时间】:2019-02-17 02:42:36 【问题描述】:我想学习如何通过整个 model
获取多对多中间表的序列化器数据,而不仅仅是通过 id。
#this is my model class
class ProductMaterial(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
material = models.ForeignKey(Material, on_delete=models.CASCADE)
material_rate = models.FloatField(blank=True, null=True)
material_price = models.FloatField(blank=True, null=True)
#serializer
class ProductMaterialSerializer(serializers.ModelSerializer):
class Meta:
model = ProductMaterial
fields = '__all__'
这会返回:
"id": 1,
"material_rate": 0.3,
"material_price": 6.7,
"product": 186,
"material": 7
,
"id": 2,
"material_rate": 0.7,
"material_price": 1.7,
"product": 186,
"material": 8
,
问题:
-
第一个问题是由于多对多表而重复数据
我也想查看我的
product
和 material
模型字段。
我的目标:
"id": 1,
"product":
"name" : "abcd",
"date" : "01.01.2018"
,
"material": [
"id" : 7,
"material_rate" : 0.3,
"material_price" : 6.7,
,
"id" : 8,
"material_rate" : 0.7,
"material_price" : 1.7,
,
]
,
解决方案 2:
我已经实现了这个解决方案 -> https://***.com/a/45834689/5491260 它帮助了我。
【问题讨论】:
【参考方案1】:来自文档,
深度选项应设置为一个整数值,表示 在恢复到之前应该遍历的关系深度 平面表示。
所以,在 Meta 类中使用 depth=1
class ProductMaterialSerializer(serializers.ModelSerializer):
class Meta:
model = ProductMaterial
fields = '__all__'
depth = 1
【讨论】:
谢谢它解决了我的 2. 问题。您能与我分享如何解决“重复”问题吗? 这里的重复数据是什么?product
?
是的 product 重复。正如你在我的目标上看到的那样,我想获得这种格式。
在我的模型中 a Product
可以有 许多 Material
s 和 a Material
可以是在 许多 Product
s 中,每个 Material
在特定的 Product
中都有自己的 rate, price
,我希望我的数据格式类似于 我的目标
@JPG Product
是 FK。我认为 ProductMaterial
最多只能有 1 个 Product
与之关联(不是 1 个或更多)。以上是关于在 Django Rest Framework 中序列化多对多中间表的主要内容,如果未能解决你的问题,请参考以下文章