【问题标题】:DRF serialization - many-to-many field with throughDRF 序列化 - 多对多字段通过
【发布时间】:2021-07-12 15:20:07
【问题描述】:

如何通过参数对多对多字段的数据进行序列化? 我有 3 个模型:

class Ingredient(models.Model):
    name = models.CharField(
        max_length=200,
    )
    measurement_unit = models.CharField(
        max_length=200,
    )

class Recipe(models.Model):
    name = models.CharField(
        max_length=200,
    )
    ingredients = models.ManyToManyField(
        Ingredient,
        through='RecipeIngredientsDetails',
    )

class RecipeIngredientsDetails(models.Model):
    recipe = models.ForeignKey(
        Recipe,
        on_delete=models.CASCADE,
    )
    ingredient = models.ForeignKey(
        Ingredient,
        on_delete=models.CASCADE,
    )
    amount = models.FloatField()

我的序列化器:

class IngredientSerializer(ModelSerializer):
    # amount = ???

    class Meta:
        model = Ingredient
        fields = ["id", "name", "amount", "measurement_unit"]
        
class RecipeSerializer(ModelSerializer):
    class Meta:
        model = Recipe
        fields = ["name", "ingredients"]
        depth = 1

现在,我明白了:

{
"name": "Nice title",
"ingredients": [
{
    "id": 1,
    "name": "salt",
    "measurement_unit": "g"
},
{
    "id": 2,
    "name": "sugar",
    "measurement_unit": "g"
}
]
}

我需要每种成分的量值。如何实现?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您需要更改IngredientSerializer 以使用RecipeIngredientsDetails 模型,并在RecipeSerializer 内显式设置相关序列化程序:

    from rest_framework.serializers import ReadOnlyField
    
    class IngredientDetailSerializer(ModelSerializer):
        id = ReadOnlyField(source='ingredient.id')    
        ingredient = ReadOnlyField(source='ingredient.name')
        measurement_unit = ReadOnlyField(source='ingredient.measurement_unit')
    
        class Meta:
            model = RecipeIngredientsDetails
            fields = ["id", "ingredient", "measurement_unit", "amount",]
            
    class RecipeSerializer(ModelSerializer):
        ingredients = IngredientDetailSerializer(source="recipeingredientsdetails_set", many=True)
    
        class Meta:
            model = Recipe
            fields = ["name", "ingredients"]
            depth = 1

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多