Django Rest框架在嵌套关系上保持返回错误

Roy*_*ins 6 django django-rest-framework

盯着我的代码很长一段时间,我一直遇到同样的错误.有趣的是,我为我的模型的另一部分制作了一组类似的序列化程序,这些工作正常.

这是我不断得到的错误:

/onderhoudapi/conditiedeel/.json处的AttributeError在尝试获取gebreken序列化程序上的 字段值时出现AttributeError ConditiedeelSerializer.序列化程序字段可能名称不正确,并且与Conditiedeel 实例上的任何属性或键都不匹配.原始异常文本是:'Conditiedeel'对象没有属性'gebreken'.

serializers.py

class GebrekSerializer(serializers.ModelSerializer):
    class Meta:
        model = Gebrek
        fields = ('naam', 'get_type', 'get_omvang_waarde', 'get_intensiteit_waarde', 'get_ernst_waarde')


class ConditiedeelSerializer(serializers.ModelSerializer):
    gebreken = GebrekSerializer(many=True, read_only=True)

    class Meta:
        model = Conditiedeel
        fields = ('deel', 'conditiescore', 'gebreken', )
Run Code Online (Sandbox Code Playgroud)

models.py

class Conditiedeel(models.Model):
    deel = models.OneToOneField(Deel, null=True, blank=True)
    conditiegroep = models.ForeignKey(Conditiegroep)
    conditiescore = models.IntegerField(choices=CONDITIE_KEUZES)

    #some class methods here


class Gebrek(models.Model):
    naam = models.CharField(max_length=80)
    omvang = models.IntegerField(choices=OMVANG_KEUZES)
    intensiteit = models.IntegerField(choices=INTENSITEIT_KEUZES)
    conditiedeel = models.ForeignKey(Conditiedeel)
    nengebrek = models.ForeignKey(Nengebrek)

    #class methods here
Run Code Online (Sandbox Code Playgroud)

如您所见,Gebrek该类与Conditiedeel类具有外来关系.这应该意味着我可以像这里一样使用嵌套关系.我想我是密切关注这个例子的,但是我无法让它发挥作用.

lev*_*evi 9

这里的问题是Conditiedeel模型没有被调用的属性gebreken,记住你正试图获得向后关系对象,所以你需要gebreken_set像django docs那样使用字段.所以你的序列化应该是

class ConditiedeelSerializer(serializers.ModelSerializer):
    gebrek_set = GebrekSerializer(many=True, read_only=True)

    class Meta:
        model = Conditiedeel
        fields = ('deel', 'conditiescore', 'gebrek_set', )
Run Code Online (Sandbox Code Playgroud)

  • 这确实有效。很困惑,因为文档使用“tracks”而不是“track_set”.. (2认同)