4

Я пытаюсь написать сериализаторы для своих моделей, которые унаследованы от некоторых базовых классов, но я получаю ошибку атрибута. Буду признателен за любую помощь.Ошибка атрибута Django REST serializing

Базовый класс:

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) 

Подкласс:

class SkillTranslation(AbstractTranslationModel): 

    class Meta: 
     unique_together = (('translation_of', 'language'),) 

    # Foreign keys 
    translation_of = models.ForeignKey(Skill, related_name='translations', 
             related_query_name='translation') 

Вот сериализатору для этого класса:

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'. 

EDIT: Вот дополнительная информация,

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

Спасибо, Антон

ответ

3

translations обратная связь на Skill модели, следовательно, Skill.transations является отношения «один ко многим». В вашем сериализаторе вы определили его как отношение «один к одному», поэтому DRF не может найти какой-либо из атрибутов, поскольку они не существуют на QuerySet. Чтобы исправить это вам просто нужно использовать many=True:

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

Где вы были раньше, когда я потратил 3 часа :) Я, слава Богу, вы ответили здесь. Я понятия не имел! –

+0

рад был в состоянии помочь! – miki725

Смежные вопросы