2016-11-15 2 views
5

Ich erstelle ein Django-Queryset von Hand und möchte nur das Django ORM verwenden, um die resultierende querset.query SQL selbst zu lesen, ohne meine DB zu treffen.Wie kann ich feststellen, ob ein Django QuerySet ausgewertet wurde?

Ich weiß Django quersets sind faul, und ich sehe alle ops, die eine queryset ausgewertet auslösen:

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

Aber ... was ist, wenn ich will nur rein meinen Code überprüfen, baut die queryset Eingeweide, aber wertet und schlägt meine DB noch nicht versehentlich? Gibt es Attribute für das Objekt des Abfrage-Objekts, die ich verwenden kann, um zu verifizieren, dass es nicht ausgewertet wurde, ohne es tatsächlich zu bewerten?

+0

Ich denke nicht, ich denke, es gibt keinen solchen Anwendungsfall benötigt. Warum brauchen Sie eine solche Funktion? –

+0

Ich habe andere Anwendungen für die SQL, die das Django ORM erstellt, als es tatsächlich sofort zu bewerten. – slumtrimpet

Antwort

5

Für querysets, die ein select zurückzukehren Listen von Modellinstanzen, wie ein Basisfilter oder ausschließen zu verwenden, das _result_cache Attribut ist None wenn die queryset nicht bewertet wurde, oder eine Liste von Ergebnissen, wenn es hat. Die üblichen Vorbehalte gegenüber nicht öffentlichen Attributen gelten.

Für andere Abfragegruppen (zählen, löschen, etc) Ich bin mir nicht sicher, ob es einen einfachen Weg gibt. Vielleicht ist Ihre Datenbank-Logs sehen, oder in DEBUG Modus ausführen und überprüfen connection.queries wie hier beschrieben: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

+0

Perfekt, vielen Dank. – slumtrimpet

+0

@slumtrimpet - aktualisiert, um anzuzeigen, dass dies für Abfragen funktioniert, die SELECT-SQL zum Abrufen von Datensätzen verwenden, aber nicht unbedingt für alle Abfragen. –

1

Für diejenigen, die wennQuerySet s wissen wollen, werden ausgewertet: es ist, wenn sie iteriert sind, in Scheiben geschnitten, gebeizt oder gecachten, repr() 'd, len()' d, list() ‚ed oder bool() 'ed. Siehe https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

+2

Das ist der Link, den das OP in der Frage gab. Die Frage ist nicht "Wann evaluiert Django ein Anfrage-Set?" Lautet die Frage "Ein Anfrage-Objekt übergeben, wie kann ich feststellen, ob es bereits ausgewertet wurde?" Sehen Sie sich den Quellcode an, um zu sehen, wie '_result_cache' sich während dieser Operationen ändert: https://github.com/django/django/blob/master/django/db/models/query.py –

+0

@PeterDeGlopper oh, ja, ich bin so Entschuldigung, du hast vollkommen recht. Ich werde die Antwort so bearbeiten, dass sie für die Leute informativ ist, die wissen möchten, wann Django sie bewertet. – feakuru

Verwandte Themen