2013-04-24 6 views
7

Sto esponendo un'API per un modello particolare e desidero serializzare alcuni dei relativi campi. Questi campi correlati sono comunemente ripetuti e non voglio dover eseguire numerose query db per ogni serializzazione del campo correlata. Esiste un modo semplice per interrogare preventivamente tutte le istanze correlate e quindi avere il serializzatore RelatedField che lo cerca in un dizionario? O forse per specificare da ModelSerializer del campo correlato?C'è un modo per pre-cercare i modelli di campo correlati?

risposta

5

È possibile utilizzare i metodi standard di Django prefetch_related e select_related sul queryset.

Nella vista, utilizzare l'attributo queryset anziché il collegamento model. Ad esempio ...

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

Grazie Tom. Non ero a conoscenza di prefetch_related. Anche se sembra che sia meglio usarlo piuttosto che non, non è ancora l'implementazione più efficiente per il mio scenario. I motivi sono: (1) utilizza la query IN che è più query, mentre la mia applicazione può prevedere in una query i risultati di cui ha bisogno; e (2) la maggior parte dei campi relativi usano la stessa classe di modello e non sembra che il prefect_related ne sia intelligente. Avete altri suggerimenti per un modo più personalizzato di farlo? – jacob

+0

Non sono esattamente sicuro di come sia il tuo caso d'uso, ma se hai bisogno di qualcosa di personalizzato che non si adatta perfettamente alle visualizzazioni generiche pre-fornite, ti suggerisco di scrivere esplicitamente i metodi di visualizzazione. –

+0

Ad esempio, come nella prima parte del tutorial parte 3 ... http://django-rest-framework.org/tutorial/3-class-based-views.html –

Problemi correlati