Django hat Outer Join mit Filter verlassen

8

Ich benutze Djangos eingebautes Benutzermodell und habe ein benutzerdefiniertes Foo-Objekt mit einem ForeignKey an den Benutzer. Ich suche alle User-Objekte und alle Foo-Objekte, die bestimmte Bedingungen erfüllen, wie folgt:

%Vor%

Wie soll ich das in Django schaffen? Bisher habe ich es versucht:

%Vor%

aber das generiert SQL ähnlich wie folgt:

%Vor%

und gibt nur Benutzerobjekte zurück, die über Foo-Objekte verfügen, die den Kriterien entsprechen. Alternativ kann ich alle Benutzerobjekte auswählen und für jede eine Abfrage ausführen, aber das wäre wesentlich weniger effizient.

    
Phobophobia 25.03.2013, 18:43
quelle

3 Antworten

1

Wenn Sie möchten, dass Django alle User -Objekte und alle Foo -Objekte abruft, die zu einem Benutzerobjekt gehören, dann verwenden Sie select_related() :

%Vor%

Aber hier wollen Sie nicht alle die Foo -Objekte, die zu einem Benutzerobjekt gehören, sondern nur die Teilmenge, die Ihren Kriterien entspricht. Ich weiß nicht, wie ich Django sagen kann, dass er das in einem einzigen Abfrage-Set tun soll. Aber was Sie können tun, ist beides zu tun, wählt separat und macht den Join in Python:

%Vor%

(Dies macht keine Datenbankarbeit mehr oder überträgt mehr Daten als Ihr LEFT OUTER JOIN , also denke ich, dass es ein vernünftiger Ansatz ist.)

    
Gareth Rees 25.03.2013, 20:46
quelle
1

Es ist klobig, aber das sollte es tun:

%Vor%

Sie können zusätzliche Attribute für die zurückgegebenen Benutzerobjekte einfügen, indem Sie sie zur linken Seite der Auswahl hinzufügen.

    
Chris Withers 15.09.2015 13:46
quelle
0

Um eine LEFT OUTER JOIN zu erhalten, können Sie gehen:

%Vor%

Django verwendet foo__isnull=True , um es zu einem LEFT OUTER JOIN zu leiten. Wenn foo__isnull=False angegeben wird, wird INNER JOIN ohne den Filterparameter erzeugt.

    
Richard Zschech 19.01.2018 02:21
quelle

Tags und Links