python - when - Error de atributo Django REST serialización
django rest framework with django 2 (1)
Intento escribir serializadores para mis modelos, que se heredan de algunas clases base, pero obtengo Attribute Error. Apreciaría cualquier ayuda.
Clase base:
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)
Subclase:
class SkillTranslation(AbstractTranslationModel):
class Meta:
unique_together = ((''translation_of'', ''language''), )
# Foreign keys
translation_of = models.ForeignKey(Skill, related_name=''translations'',
related_query_name=''translation'')
Aquí hay un serializador para esta clase:
class SkillTrSerializer(serializers.ModelSerializer):
class Meta:
model = SkillTranslation
fields = (''language'', ''name'', ''description'', )
Y aquí está el serializador para una clase, que contiene esos:
class SkillSerializer(serializers.ModelSerializer):
translations = SkillTrSerializer()
class Meta:
model = Skill
fields = (''translations'', )
Aquí está la salida de la consola:
>>> 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''.
EDITAR: Aquí hay información adicional
>>> 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)
Gracias, Anton
translations
son una relación inversa en el modelo de Skill
, por Skill.transations
tanto, Skill.transations
es una relación de uno a muchos. En su serializador lo definió como una relación uno-a-uno, razón por la cual DRF no puede encontrar ninguno de los atributos, ya que no existen en QuerySet
. Para solucionarlo, simplemente necesita usar many=True
:
class SkillSerializer(serializers.ModelSerializer):
translations = SkillTrSerializer(many=True)