with when got framework for example attempting python django serialization django-rest-framework attributeerror

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)