与'through'表序列化关系时的AttributeError

时间:2015-07-08 22:56:20

标签: python django rest django-rest-framework

我正在努力使 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')

任何人都能对这个问题有所了解吗?我真的很感激! 谢谢!

1 个答案:

答案 0 :(得分:1)

最简单的更改方法是更改​​RecipeSerializer

中步骤的来源
class RecipeSerializer(serializers.HyperlinkedModelSerializer):

    steps = StepInfoSerializer(many=True, read_only=True, source='stepinfo_set')

现在我将对此作出解释。

首先,只在Django世界。

例如,

recRecipe模型的实例对象。

得到两个陈述的区别。

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()