我正在努力使 Django Rest Framework 返回一个使用through
关键字构建的多对多关系。但是,我收到了一个错误,并且不知道出了什么问题。
我得到的错误是:
尝试获取字段值时出现AttributeError 序列化程序
step_number
上的StepInfoSerializer
。序列化器字段 可能命名不正确,并且不匹配任何属性或键Step
个实例。原始异常文本是:'Step'对象没有 属性'step_number'。
这是我的模特:
class Step(BaseModel):
description = models.TextField(null=False, blank=False)
class StepInfo(BaseModel):
recipe = models.ForeignKey('Recipe')
step = models.ForeignKey(Step)
step_number = models.IntegerField()
class Recipe(BaseModel):
title = models.CharField(max_length=100)
steps = models.ManyToManyField(Step, through='StepInfo')
串行器的实现:
class StepInfoSerializer(serializers.HyperlinkedModelSerializer):
description = serializers.CharField(source="step.description")
class Meta:
model = StepInfo
fields = ('id',
'step_number',
'description')
class RecipeSerializer(serializers.HyperlinkedModelSerializer):
steps = StepInfoSerializer(many=True, read_only=True)
class Meta:
model = Recipe
fields = ('id',
'steps')
任何人都能对这个问题有所了解吗?我真的很感激! 谢谢!
答案 0 :(得分:1)
最简单的更改方法是更改RecipeSerializer
class RecipeSerializer(serializers.HyperlinkedModelSerializer):
steps = StepInfoSerializer(many=True, read_only=True, source='stepinfo_set')
现在我将对此作出解释。
首先,只在Django世界。
例如, rec
是Recipe
模型的实例对象。
得到两个陈述的区别。
rec.steps.all()
rec.stepinfo_set.all()
rec.steps.all()
将返回Step
对象实例的数组,确保它是目标模型ManyToManyField ,而不是到模型。< / p>
如果您想访问到模型,则需要访问related_name
的{{1}},参考直通模型中的当前模型(ForeignKey
模型)。
稍后,我将添加一个带有related_name的示例。
因为在StepInfo
中未指定StepInfo
,所以django会自动为您提供默认的related_name related_name
。 (这个名称是第一个片段中的一个。)
所以将返回如何通过实例。只是stepinfo_set
。
好的,最后,我建议您在Through Models中将related_name添加到ForeignKey。
rec.setpinfo_set.all()