Django Rest框架不断返回嵌套关系的错误 [英] Django Rest framework keeps returning error on nested relationship

查看:273
本文介绍了Django Rest框架不断返回嵌套关系的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

盯着我的代码已经有一段时间了,我不断遇到同样的错误。有趣的是,我为我的模型的另一部分制作了一个类似的序列化器,这些工作正常。



这是我不断得到的错误:


/onderhoudapi/conditiedeel/.json中的AttributeError在尝试获取字段值 gebreken 时获得AttributeError
code>在序列化器
ConditiedeelSerializer 。序列化器字段可能不正确地命名为
,并且不符合 Conditiedeel
实例上的任何属性或键。原始异常文本是:'Conditiedeel'对象没有
属性'gebreken'。


serializers.py

  class GebrekSerializer(serializers.ModelSerializer):
class Meta:
model = Gebrek
fields =(' $ a


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

class Meta:
model = Conditiedeel
fields =('deel','conditionaliescore','gebreken')

models.py

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

#some这里的类方法


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

#class方法这里

如您所见, Gebrek 课程与Conditiedeel课程有外交关系。这意味着我可以使用像 here 这样的嵌套关系。我认为我紧紧关注了这个例子,但我无法让它工作。

解决方案

这里的问题是 Conditiedeel 模型没有一个名为 gebreken 的属性,请记住,您正在尝试获取向后关系对象,因此您需要使用 gebreken_set 作为django的字段 docs 说。所以你的串行器应该是

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

class Meta:
model = Conditiedeel
fields =('deel','conditionaliescore','gebrek_set',)


Staring at my code for quite a while and I keep running into the same error. Funny thing is that I made a similar set of serializers for another part of my model and those work fine.

This is the error that I keep getting:

AttributeError at /onderhoudapi/conditiedeel/.json Got AttributeError when attempting to get a value for field gebreken on serializer ConditiedeelSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Conditiedeel instance. Original exception text was: 'Conditiedeel' object has no attribute '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', )

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

As you can see, the Gebrek class has a foreign relationship to the Conditiedeel class. That should mean I can use a nested relationship like here. I think I followed the example closely, yet I cannot get it to work.

解决方案

The problem here is that Conditiedeel model has not an attribute called gebreken, remember that you are trying to get backwards relationship objects, so you need to use gebreken_set as field as django docs says. So your serializer should be

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

    class Meta:
        model = Conditiedeel
        fields = ('deel', 'conditiescore', 'gebrek_set', )

这篇关于Django Rest框架不断返回嵌套关系的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆