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.
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()
:
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:
(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.)
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.
Um eine LEFT OUTER JOIN
zu erhalten, können Sie gehen:
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.