如何使用 django rest framework 序列化一个 ManyToManyField 和一个 Through Model

Posted

技术标签:

【中文标题】如何使用 django rest framework 序列化一个 ManyToManyField 和一个 Through Model【英文标题】:How to serialize using django rest_framework a ManyToManyFields with a Through Model 【发布时间】:2013-10-11 09:27:22 【问题描述】:

我有一个 Recipe 模型,其中包含一个 IngredientType 对象的 M2M 字段。这个字段,又名成分列表,通过一个成分对象使用臭名昭著的“通过”模型,该对象将额外的数据添加到我的成分类型。 这些是我的课程:

class Recipe(models.Model):
    user_profile = models.ForeignKey(UserProfile, null=True, blank = True)
    name = models.CharField(max_length=200)
    photo1 = models.ImageField( upload_to = 'images/recipies', help_text="This photo will show by default")
    ingredient_list = models.ManyToManyField(IngredientType,through='Ingredient')

class Ingredient(models.Model):
    ingredient_type = models.ForeignKey(IngredientType)
    recipe = models.ForeignKey(Recipe)
    amount = models.IntegerField()
    units = models.CharField(max_length=4,choices=UNIT, 
                               default=None, null=True, blank = True)

class IngredientType(models.Model):
    name = models.CharField(max_length=200)
    plural_name = models.CharField(max_length=200)
    photo = models.ImageField( upload_to = 'images/ingredients')
    is_main = models.BooleanField()

我尝试使用 rest_framework 对它们进行序列化:

class IngredientTypeSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = IngredientType
        fields=('name', 'plural_name', 'photo', 'is_main')

class IngredientSerializer(serializers.HyperlinkedModelSerializer):
    ingredient_type = IngredientTypeSerializer(source = 'ingredient_type')
    amount =  serializers.Field(source='ingredient_type.amount')
    units =  serializers.Field(source='ingredient_type.units')
    recipe = serializers.Field(source='Recipe.name')
class Meta:
    model = Ingredient
    fields=('amount', 'units')

class RecipeSerializer(serializers.ModelSerializer):
    ingredient_list = IngredientSerializer(source='ingredient_list', many=True, read_only = True)
    class Meta:
        model = Recipe
        fields = ('user_profile', 'name','photo1','ingredient_list')

但是当试图运行它时,我得到一个 AttributeError : “IngredientType”对象没有“ingredient_type”属性

显然,当我换行时:

ingredient_list = IngredientSerializer(source='ingredient_list', many=True, read_only = True)

到:

ingredient_list = IngredientTypeSerializer(source='ingredient_list', many=True, read_only = True)

也就是说,更改序列化程序,它可以工作,但没有获取我的成分数据。 我用过这个链接: Include intermediary (through model) in responses in Django Rest Framework 作为参考,但显然它并没有解决我的问题。 任何帮助,将不胜感激。 tnx, 尼赞

【问题讨论】:

【参考方案1】:

在您的Recipe 模型上,对于ingredient_list 字段,您有一个指向IngredientTypeManyToManyField

在您的RecipeSerializer 上,ingredient_list 字段没有使用IngredientTypeSerializer,而是使用IngredientSerializer

这是错误。 (它解释了错误消息——source 的实际模型没有序列化程序正在查找的属性。)

除此之外,您的命名方案非常混乱。 “Recipe”很好,但您所说的“IngredientType”可能应该只是“Ingredient”,然后您应该为直通表找到一个不同的名称。 (可能是“RecipeIngredientDetails”)

希望对你有帮助。

【讨论】:

以上是关于如何使用 django rest framework 序列化一个 ManyToManyField 和一个 Through Model的主要内容,如果未能解决你的问题,请参考以下文章

django.test.client 上的 Django rest 框架导入错误

无法使用 Django Rest 框架发送压缩的 gzip 数据

Django 和 Django 休息框架

Django前后端分离——drf

Django REST to React - 无需密码即可获取社交身份验证令牌

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应