2 Stimmen

Sind verkettete QuerySet-Filter gleichwertig mit der Definition mehrerer Felder in einem einzigen Filter mit dem Django ORM?

Beim Filtern eines Querysets frage ich mich, ob die folgenden Punkte gleichwertig sind.

User.objects.filter(username='josh').filter(email__startswith='josh')
User.objects.filter(username='josh', email__startswith='josh')

Ich kann mir nicht vorstellen, wie sich das generierte SQL zwischen den beiden unterscheiden könnte. Auch die Dokumentation scheint keine Unterschiede zu erwähnen.

2voto

Jingo Punkte 3160

Sie können diese Abfragen in der Shell ausführen und das erzeugte SQL wie folgt ausdrucken:

>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query

Ich habe eine ähnliche Abfrage getestet, wie Sie sie hier erhalten haben, und es gab keinen Unterschied im generierten SQL-Code, beide Anweisungen verwenden am Ende die gleiche WHERE-Anweisung.

Außerdem sollte es in diesem Fall keinen Unterschied machen, ob Sie die Filter verketten oder sie in einem Schritt anwenden.

Es gibt jedoch Szenarien, in denen die Reihenfolge der Filterung von Bedeutung ist. Schauen Sie mal aquí y aquí .

0voto

Django QuerySets sind faul und laufen:

User.objects.filter(username='josh').filter(email__startswith='josh')

oder sogar

a = User.objects.filter(username='josh')
a = a.filter(email__startswith='josh')

erzeugt nur eine einzige Datenbankabfrage, die ausgeführt wird, wenn Sie versuchen, auf Ihre Daten zuzugreifen. Diese Abfrage stimmt mit allen Filtern und Ausschlüssen in der Where-Klausel überein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X