python - 在 Django Rest Framework 中使用中介模型序列化 ManyToMany 关系

标签 python django django-rest-framework

我在使用 DRF3 中的 through 参数序列化多对多关系时遇到了一些问题

基本上我有食谱和配料,通过指定特定配料的用量和单位的中间模型组合。

这些是我的模型:

from django.db import models
from dry_rest_permissions.generics import authenticated_users, allow_staff_or_superuser
from core.models import Tag, NutritionalValue
from usersettings.models import Profile

class IngredientTag(models.Model):
    label = models.CharField(max_length=255)

    def __str__(self):
        return self.label


class Ingredient(models.Model):
    recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE)
    ingredient_tag = models.ForeignKey(IngredientTag, on_delete=models.CASCADE)
    amount = models.FloatField()
    unit = models.CharField(max_length=255)


class RecipeNutrition(models.Model):
    nutritional_value = models.ForeignKey(NutritionalValue, on_delete=models.CASCADE)
    recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE)
    amount = models.FloatField()


class Recipe(models.Model):
    name = models.CharField(max_length=255)
    ingredients = models.ManyToManyField(IngredientTag, through=Ingredient)
    tags = models.ManyToManyField(Tag, blank=True)
    nutritions = models.ManyToManyField(NutritionalValue, through=RecipeNutrition)
    owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, blank=True, null=True)

    def __str__(self):
        return self.name

这些是目前我的序列化程序:

from recipes.models import Recipe, IngredientTag, Ingredient
from rest_framework import serializers

class IngredientTagSerializer(serializers.ModelSerializer):
    class Meta:
        model = IngredientTag
        fields = ('id', 'label')

class IngredientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ingredient
        fields = ('amount', 'unit')

class RecipeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('id', 'url', 'name', 'ingredients', 'tags', 'nutritions', 'owner')
        read_only_fields = ('owner',)
        depth = 1

我已经在 SO 和网络上搜索了很多,但我无法弄明白。如果有人能指出我正确的方向,那就太好了。

我可以这样获取要退回的成分列表:

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "url": "http://localhost:8000/recipes/1/",
            "name": "Hallo recept",
            "ingredients": [
                {
                    "id": 1,
                    "label": "Koek"
                }
            ],
            "tags": [],
            "nutritions": [],
            "owner": null
        }
    ]
}

但是我想要的是金额和单位也要返回!

最佳答案

我通过以下方式得到了我想要的:

from recipes.models import Recipe, IngredientTag, Ingredient
from rest_framework import serializers

class IngredientTagSerializer(serializers.ModelSerializer):
    class Meta:
        model = IngredientTag
        fields = ('id', 'label')

class IngredientSerializer(serializers.ModelSerializer):
    ingredient_tag = IngredientTagSerializer()

    class Meta:
        model = Ingredient
        fields = ('amount', 'unit', 'ingredient_tag')

class RecipeSerializer(serializers.ModelSerializer):
    ingredients = IngredientSerializer(source='ingredient_set', many=True)

    class Meta:
        model = Recipe
        fields = ('url', 'name', 'ingredients', 'tags', 'nutritions', 'owner')
        read_only_fields = ('owner',)
        depth = 1

使用 ingredient_tag 的 ingredient_set 作为 IngredientSerializer 的来源导致我需要的响应:

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "url": "http://localhost:8000/recipes/1/",
            "name": "Hallo recept",
            "ingredients": [
                {
                    "amount": 200.0,
                    "unit": "g",
                    "ingredient_tag": {
                        "id": 1,
                        "label": "Koek"
                    }
                },
                {
                    "amount": 500.0,
                    "unit": "kg",
                    "ingredient_tag": {
                        "id": 3,
                        "label": "Sugar"
                    }
                }
            ],
            "tags": [],
            "nutritions": [],
            "owner": null
        }
    ]
}

我不知道这是否是最好的解决方法,所以我会等到知道他们的 DRF 的人发表评论或者也许有人发布更好的东西,然后再标记为答案。

关于python - 在 Django Rest Framework 中使用中介模型序列化 ManyToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35867561/

相关文章:

python - 将 XPath 与 Scrapy 结合使用

python - 如何解决 AMD64 Win Python35_d.lib 中缺少 PyModule_Create2 的问题?

django - 只从查询集中获取某个类型的最新项目

python - Django 休息框架 : How to initialise & use custom exception handler?

django - 使用 djoser 实现密码重置

Django 休息框架 : Pagination with annotated Queryset

用于创建图像镜像并将其与一定量的白色混合的 Python 代码。

python - 如何快速从 pandas df 读取和绘制数组

django - Pandas -分组和聚合列中具有相同值的连续行

django - 在 Django i18n 中,语言环境路径不起作用