在 Django Rest Framework 中序列化多对多中间表

adn*_*aya 7 django serialization many-to-many django-rest-framework

我想学习如何整体获取多对多中间表的序列化程序数据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__'
Run Code Online (Sandbox Code Playgroud)

这将返回:

    {
        "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
    },
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 第一个问题是由于多对多表而重复数据
  2. 我也想查看我的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,

                  },
               ]
},
Run Code Online (Sandbox Code Playgroud)

解决方案2:

我已经实施了这个解决方案 -> /sf/answers/3208428261/ 并且它帮助了我。

JPG*_*JPG 5

从文档中,

深度选项应设置为整数值,该值指示在恢复为平面表示之前应遍历的关系深度。

所以,depth=1在 Meta 类中使用

class ProductMaterialSerializer(serializers.ModelSerializer):
       class Meta:
           model = ProductMaterial
           fields = '__all__'
           depth = 1
Run Code Online (Sandbox Code Playgroud)