Есть ли более эффективный способ сделать это, возможно, с выражениями F? Некоторые способы сокращения попадания в БД?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 заключается в том, что получение получает объект, а затем делает обновление, как вы обнаружили. Фильтр фактически не извлекает ничего из базы данных, пока вы не возьмете фрагмент из него или не перейдете через него. – e4c5
Я думал, что это ударит по БД 2 раза, потому что один раз, чтобы получить объект, затем еще раз обновить указанный объект. –