2013-04-24 9 views
7

Ich mache eine API für ein bestimmtes Modell verfügbar und möchte einige der zugehörigen Felder serialisieren. Diese verwandten Felder werden häufig wiederholt, und ich möchte keine zahlreichen Datenbankabfragen für jede verwandte Feldserialisierung durchführen müssen. Gibt es eine einfache Möglichkeit, alle zugehörigen Instanzen vorab abzufragen, und dann hat der RelatedField-Serializer es in einem Wörterbuch nachgeschlagen? Oder vielleicht aus dem ModelSerializer des verwandten Feldes angeben?Gibt es eine Möglichkeit, verwandte Feldmodelle vorab zu suchen?

Antwort

5

Sie können die Standardmethoden prefetch_related und select_related von Django für Ihr Abfrage-Set verwenden.

Verwenden Sie in der Ansicht das Attribut queryset anstelle der Verknüpfung model. Zum Beispiel ...

class ExampleView(generics.ListCreateAPIView): 
    serializer_class = ExampleSerializer 
    queryset = Example.objects.select_related(...) 
+0

Danke Tom. Ich war mir nicht bewusst, prefetch_related. Obwohl es klingt, als wäre es besser, es zu benutzen, ist es immer noch nicht die effizienteste Implementierung für mein Szenario. Die Gründe sind: (1) es verwendet IN-Abfrage, die mehrere Abfragen ist, während meine Anwendung in einer Abfrage vorhersagen kann, welche Ergebnisse sie benötigt; und (2) die meisten der verwandten Felder verwenden die gleiche Modellklasse und es sieht nicht so aus, als wäre prefect_related schlau daran. Haben Sie weitere Vorschläge für eine individuellere Vorgehensweise? – jacob

+0

Ich weiß nicht genau, wie Ihr Anwendungsfall aussieht, aber wenn Sie etwas Brauchbares brauchen, das nicht ganz in die vorgegebenen generischen Ansichten passt, würde ich vorschlagen, die Ansichtsmethoden explizit zu schreiben. –

+0

Zum Beispiel, wie im ersten Teil des Tutorials Teil 3 ... http://django-rest-framework.org/tutorial/3-class-based-views.html –

Verwandte Themen