Django REST序列化属性错误

2024-10-02 10:24:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为我的模型编写序列化程序,这些模型是从一些基类继承的,但是我得到了属性错误。我会很感激你的帮助。在

基类:

class AbstractTranslationModel(models.Model):
    class Meta:
        abstract = True

    language = models.CharField(max_length=2, choices=LANGUAGES)

    # Translatable fields
    name = models.CharField(max_length=22)
    description = models.TextField(default='')

    def __str__(self):
        return self.name + ' ' + str(self.language)

子类:

^{pr2}$

以下是此类的序列化程序:

class SkillTrSerializer(serializers.ModelSerializer):
    class Meta:
        model = SkillTranslation
        fields = ('language', 'name', 'description', )

下面是一个类的序列化程序,它包含这些序列化程序:

class SkillSerializer(serializers.ModelSerializer):
    translations = SkillTrSerializer()

    class Meta:
        model = Skill
        fields = ('translations', )

以下是控制台输出:

>>> from skills.models import *
>>> from api.serializers import *
>>> skill = Skill.objects.all().first()
>>> skill.translations.all()
[<SkillTranslation: English skill EN>, <SkillTranslation: Рашн RU>]
>>> skill.translations.all().first()
<SkillTranslation: English skill EN>
>>> skill.translations.all().first().language
'EN'
>>> s = SkillSerializer(instance=skill)
>>> s.data

AttributeError: Got AttributeError when attempting to get a value for field `language` on serializer `SkillTrSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance.
Original exception text was: 'RelatedManager' object has no attribute 'language'.

编辑:以下是其他信息

>>> s
SkillSerializer(instance=<Skill: English skill>):
    translations = SkillTrSerializer():
        id = IntegerField(label='ID', read_only=True)
        language = ChoiceField(choices=(('EN', 'English'), ('RU', 'Russian'), ('UA', 'Ukrainian')), required=True)
        name = CharField(max_length=22)
        description = CharField(required=False, style={'base_template': 'textarea.html'})
        translation_of = PrimaryKeyRelatedField(queryset=Skill.objects.all(), required=True)

谢谢,安东


Tags: name程序true序列化englishmodelsalllanguage
1条回答
网友
1楼 · 发布于 2024-10-02 10:24:55

translationsSkill模型上的反向关系,因此{}是一对多关系。在序列化程序中,您将其定义为一对一关系,这就是为什么DRF找不到任何属性,因为它们不存在于QuerySet上。要修复它,只需使用many=True

class SkillSerializer(serializers.ModelSerializer):
    translations = SkillTrSerializer(many=True)

相关问题 更多 >

    热门问题