/ / Ändern eines QuerySet-Objekts in Django - Django, Django-Ansichten

Ändern eines QuerySet-Objekts in Django - Django, Django-Ansichten

Kann oder soll ich das mal machen?

a = SomeTable.objects.all()
for r in a:
if r.some_column == "foo":
r.some_column = "bar"

Es hat wie ein Champion funktioniert, aber ich habe es ähnlich versuchtIrgendwo anders, und ich bekam seltsame Ergebnisse, was andeutet, dass die QuerySet-Objekte nicht gerne belästigt werden. Und ich sah nichts in der Dokumentation, gut oder schlecht für diese Art von Trick.

Ich weiß, dass es andere Wege gibt, dies zu tun, aber ich bin esspeziell zu wissen, ob das eine schlechte Idee ist, warum es schlecht ist, und wenn es wirklich schlecht ist, was der "beste" django / pythonischste Weg wäre, Werte im laufenden Betrieb zu ändern.

Antworten:

6 für die Antwort № 1

Das ist in Ordnung, solange Sie nichts tunSpäter wird dies dazu führen, dass das Abfrage-Set erneut ausgewertet wird - zum Beispiel durch Schneiden. Dadurch wird eine weitere Abfrage an die Datenbank gesendet und alle Ihre geänderten Objekte werden durch neue ersetzt.

Eine Möglichkeit, sich davor zu schützen, wäre, zuerst in eine Liste zu konvertieren:

a = list(SomeTable.objects.all())

Auf diese Weise führt weiteres Schneiden usw. nicht zu einem neuen db-Aufruf, und Änderungen bleiben erhalten.


0 für die Antwort № 2

Jep. Siehe Dokumentation Hier

SomeTable.objects.filter(some_column="foo").update(some_column="bar")

Ich würde mit Djangos Idiom gehen. Es führt das SQL mit einer einzelnen Anweisung mit "where" und "update" aus, anstatt mehrere SQL-Anweisungen zu senden, wie es der Code tun würde. Dies spart Zeit. Überprüfen Sie mit Django "s "Verbindung" um die SQL-Zeit zu testen.