2016-11-14 2 views
1

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 
+0

Können Sie das Viewset anzeigen, über das das Resort abgerufen wird? – lucasnadalutti

+0

@lucasnadalutti: Das ResortViewSet wurde dem Fragencode hinzugefügt. – RichardX

Antwort

0

MultiLingualTextViewSetRSD nicht viel Sinn in diesem Zusammenhang macht, wie das, was wollen Sie ist die Orte und ihre Beschreibungen nur in einer Anfrage zu senden, wie es sollte sein. In normalen ForeignKey Modellfeldrelationen bin ich mir ziemlich sicher, dass ResortSerializer nur die zugehörigen Datensätze wie erwartet serialisiert, aber ich bin mir nicht sicher, wie DRF-Serialisierer mit generischen Beziehungen arbeiten.

Das heißt, würde eine Lösung zu ersetzen sein:

short_description = MultiLingualTextSerializerRSD(many=True, read_only=True) 
long_description = MultiLingualTextSerializerRLD(many=True, read_only=True) 

mit:

short_description = SerializerMethodField() 
long_description = SerializerMethodField() 

und implementieren Ihre Filter-and-Serialisierung innerhalb get_short_description und get_long_description Methoden. Eine andere Lösung besteht darin, beide Attribute zu entfernen und diese Logik in die Methode to_representation Ihres Serializers zu platzieren.

+0

Funktioniert! Danke noch einmal! Meine Implementierung der ursprünglichen Frage hinzugefügt, um die Antwort zu reflektieren. – RichardX

Verwandte Themen