これはF式でもっと効率的な方法でしょうか?いくつかの方法は、DBを打つのを減らすには?Django:複数のオブジェクト属性を更新する
# 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()
変数を一貫して編集すること。
getとfilterの違いを説明できますか?あなたはアイテムを取得しているのにコード内にフィルタを使用しているので、getは非常に高速だと言います。複数のオブジェクトが必要な場合は、一般的にfilterを使用して、1つのオブジェクトを取得します。 –
getとfilterの違いは、getがオブジェクトを取得し、見つけたときに更新を行うことです。フィルタは、実際にデータベースからスライスを取り出したり、それを反復したりするまで、データベースから何も取得しません。 – e4c5
これは、DBを2回叩くと思った。なぜなら、一度オブジェクトを取得してもう一度そのオブジェクトを更新する必要があったからだ。 –