在 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
    ,

问题:

    第一个问题是由于多对多表而重复数据 我也想查看我的 productmaterial 模型字段。

我的目标:


    "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 可以有 许多 Materials 和 a Material 可以是在 许多 Products 中,每个 Material 在特定的 Product 中都有自己的 rate, price,我希望我的数据格式类似于 我的目标 @JPG Product 是 FK。我认为 ProductMaterial 最多只能有 1 个 Product 与之关联(不是 1 个或更多)。

以上是关于在 Django Rest Framework 中序列化多对多中间表的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?