Django: select_related und GenericRelation

7

Funktioniert select_related für GenericRelation-Beziehungen oder gibt es eine sinnvolle Alternative? Im Moment ruft Django individuelle SQL-Aufrufe für jedes Element in meinem Abfrage-Set auf, und ich möchte vermeiden, dass etwas wie select_related verwendet wird.

%Vor%

Ich wähle eine Reihe von Claims aus und möchte, dass die zugehörigen Proofs einzeln abgerufen und nicht einzeln abgefragt werden.

    
Parand 30.05.2010, 17:10
quelle

3 Antworten

2

Sieht aus wie select_related und GRs funktionieren nicht zusammen . Ich schätze, du könntest eine Art Accessor für Claim schreiben, der sie alle über dieselbe Abfrage erhält. Dieser Post gibt Ihnen einige Hinweise auf Raw-SQL, um generische Objekte zu erhalten, wenn Sie brauchen sie

    
Steve Jalim 30.05.2010, 17:34
quelle
16

Es gibt keine integrierte Möglichkeit, dies zu tun. Aber ich habe eine Technik zur Simulation von select_related auf generische Relationen gepostet in meinem Blog .

Blog-Inhalt zusammengefasst:

Wir können Djangos _content_object_cache -Feld verwenden, um im Wesentlichen unsere eigene select_related für generische Beziehungen zu erstellen.

%Vor%
  

Hier erhalten wir alle verschiedenen Inhaltstypen, die von den Beziehungen verwendet werden   im Abfrage-Set und dann die Menge der eindeutigen Objekt-IDs für jedes   Verwenden Sie die integrierte Methode in_bulk manager, um alle Inhaltstypen abzurufen   sofort in einem netten gebrauchsfertigen Wörterbuch mit ID. Dann machen wir eins   Abfrage nach Inhaltstyp, wieder mit in_bulk, um alle tatsächlichen zu erhalten   Objekt.

     

Schließlich setzen wir einfach das relevante Objekt auf die   _content_object_cache Feld des Quellelements. Der Grund dafür ist, dass dies das Attribut ist, das Django überprüfen würde, und wenn ja   notwendig, wenn Sie x.content_object direkt aufgerufen haben. Durch Vorbevölkern   Wir stellen sicher, dass Django niemals die Person anrufen muss   Nachschlagen - in der Tat, was wir tun, ist eine Art von   select_related () für generische Beziehungen.

    
Daniel Roseman 31.05.2010 11:13
quelle
3

Sie können die .extra () -Funktion verwenden, um Felder manuell zu extrahieren:

%Vor%

Das .filter () führt den Join aus, das .extra () zieht ein Feld. proof_proof ist der SQL-Tabellenname für das Proof-Modell. Wenn Sie mehr als ein Feld benötigen, geben Sie jedes im Wörterbuch an.

    
Eric 28.02.2011 14:03
quelle

Tags und Links