Ich habe eine Klasse, die mehrere Verweise auf die gleiche generische Klasse für verschiedene Informationen hat:Wie kann ich (mit der Django REST API) serialisieren, wenn sich die Klasse mehrfach auf die gleiche generische Beziehung bezieht?
class Resort(models.Model):
id = models.PositiveIntegerField(_('HapNr.'), primary_key=True)
symbol = models.CharField(_('Kurzzeichen'), max_length=3, blank=True)
short_description = GenericRelation('MultiLingualText',
verbose_name=_('Beschreibung (ML)'),
related_query_name='resortshortdescriptions')
long_description = GenericRelation('MultiLingualText',
verbose_name=_('Einleitung (ML)'),
related_query_name='resortlongdescription')
class MultiLingualText(models.Model):
language = models.ForeignKey(hmodels.LanguageCode, verbose_name=_('Sprache'))
valid_from = models.DateField(_('Gültig ab'), default=timezone.now)
text = models.TextField(_('Text'))
content_type = models.ForeignKey(ContentType, verbose_name=_('Typ'))
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
atu_id = models.CharField(_('ATU Text Id'), max_length=12, editable=False, blank=True)
atu_context = models.CharField(_('ATU Kontext'), max_length=1, editable=False, blank=True)
Als ich muss arbeiten, mit dieser Klasse mit dem Django Admin Ich habe zwei Inlines, die jeweils mit einem queryset die richtige Auswahl Texte für diese Beziehung. Das funktioniert gut.
Ich habe versucht, etwas ähnliches zu tun, indem ich einzelne Serializer und Viewsets für jede Relation verwende, aber wenn ich ein Resort abrufe, zeigt es immer noch alle Texte mit jeder Relation an.
Also im Grunde ist meine Frage, wie kann ich verschiedene Abfragesätze für jeden Satz von Texten verwenden? Oder ist das überhaupt möglich?
Die korrekte Umsetzung (Dank @lucasnadalutti)
class ResortSerializer(serializers.HyperlinkedModelSerializer):
short_description = serializers.SerializerMethodField()
long_description = serializers.SerializerMethodField()
def get_short_description(self, obj):
qs = MultiLingualText.objects.exclude(atu_id='').order_by('-valid_from', 'language__code')
return MultiLingualTextSerializer(qs, many=True, read_only=True).data
def get_long_description(self, obj):
qs = MultiLingualText.objects.filter(atu_id='').order_by('-valid_from', 'language__code')
return MultiLingualTextSerializer(qs, many=True, read_only=True).data
Können Sie das Viewset anzeigen, über das das Resort abgerufen wird? – lucasnadalutti
@lucasnadalutti: Das ResortViewSet wurde dem Fragencode hinzugefügt. – RichardX