Gibt es eine effizientere Möglichkeit, dies vielleicht mit F-Ausdrücken zu tun? Einige, wie man das Schlagen der DB verringert?Django: Mehrere Objekte Attribute aktualisieren
# 1st way hits DB twice per object
def something():
pks = [4, 2, 1, 3, 0]
for i in range(len(pks)):
mymodel.objects.get(pk=pks[i]).update(attr=i)
# 2nd way hits DB once per obj and once for the queryset
def something():
pks = [4, 2, 1, 3, 0]
order = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pks)])
query = mymodel.objects.filter(pk__in=pks).order_by(order)
for i in range(len(query)):
query[i].attr = i
query[i].save()
Bearbeitung, um Variablen konsistent zu verschieben.
Können Sie den Unterschied zwischen Get und Filter erklären? Sie sagen, dass get sehr schnell ist, weil es ein Element abruft, aber Filter in Ihrem Code verwendet. Ich habe generell Filter benutzt, wenn ich mehr als ein Objekt haben wollte und für ein Objekt bekommen wollte. –
Der Unterschied zwischen get und Filter besteht darin, dass get ein Objekt holt und dann das Update durchführt, wie Sie es entdeckt haben. Filter ruft tatsächlich nichts aus der Datenbank ab, bis Sie ein Segment daraus entnehmen oder es durchlaufen. – e4c5
Ich dachte, das würde die DB 2 mal treffen, weil einmal das Objekt dann noch mal aktualisiert werden soll, um das Objekt zu aktualisieren. –