Wie filterst du eine verschachtelte serializer in Django Rest Framework?
In Django Rest Framework, wie filterst du einen serializer, wenn es verschachtelt ist, in einem anderen serializer?
Meine Filter auferlegt werden, die in der DRF viewsets, aber wenn Sie rufen Sie einen serializer aus, die innerhalb einer anderen serializer, der viewset der serializer geschachtelt wird nie genannt, also die geschachtelte Ergebnisse erscheinen ungefiltert.
Habe ich versucht, indem Sie einen filter auf Ursprung viewset, aber es scheint nicht zu filtern, die geschachtelte Ergebnisse, da die nested-Ergebnisse aufgerufen werden, da eine separate pre-fretched Abfrage. (Der serializer geschachtelt ist ein reverse-lookup, die Sie sehen.)
Ist es möglich, fügen Sie ein get_queryset() überschreiben, in der geschachtelten serializer selbst (bewegen Sie es aus der viewset), zum hinzufügen von filtern gibt es? Ich habe versucht, auch kein Glück.
Dies ist, was ich versucht, aber es schadet auch nicht, die scheinen aufgerufen:
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta:
model = Questionnaire
def get_queryset(self):
query = super(QuestionnaireSerializer, self).get_queryset(instance)
if not self.request.user.is_staff:
query = query.filter(user=self.request.user, edition__hide=False)
return query
get_queryset
ist eine KlasseModelViewSet
, nicht auf der Serializer, das ist, warum es nicht immer genannt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine Unterklasse der ListSerializer und überschreiben Sie die
to_representation
Methode.Standardmäßig die
to_representation
Methodenaufrufedata.all()
auf die geschachtelte queryset. Damit Sie effektiv brauchen, umdata = data.filter(**your_filters)
bevor die Methode aufgerufen wird. Dann müssen Sie Ihre Unterklassen ListSerializer als list_serializer_class auf die meta der serializer geschachtelt.to_representation
und dann Aufruf von superlist_serializer_class
auf der Serializer geschachteltHier ist der relevante code für das Beispiel.
QuestionnaireSerializer
in die ListSerializer? Zu approximieren, muss ich filter von der Edition ID-sowie Fragebogen-ID.'FilteredListSerializer' object has no attribute 'request'
Jemand anderes immer die gleiche?Getestet viele Lösungen von SO und an anderen Orten.
Gefunden, nur eine funktionierende Lösung für Django 2.0 + DRF 3.7.7.
Definieren Sie eine Methode im model, die geschachtelte Klasse. Craft-filter, die Ihren Bedürfnissen entsprechen.
.
Achten Sie auf
source="current_epg"
und Sie bekommen den Punkt.Im Blick: