每次用户访问页面时,我必须更新数据库中的2个表。
这有效:
order_order = OrderTable.no_objects.get(order_number=order_id)
order_order.status = 'updated status'
order_order.save()
这不起作用:(通过外键与第一个表相关)
order_item = ItemsTable.objects.filter(order_id__order_number=order_id)
for i in range(order_item.count()):
order_item[i].qty = i + 5
order_item[i].qty_nextMonth = i + 30
order_item[i].save()
任何人都可以告诉代码第二部分有什么问题。它不是在更新数据库。
答案 0 :(得分:2)
每次写入order_item[i]
时,都会进行一次单独的访存,然后从数据库中返回ItemsTable
项。这意味着,如果您设置该对象的.qty = ...
属性,则该属性将被忽略,因为下一个order_item[i]
将触发新的提取。您的order_item[i].save()
会更新数据库中的记录,但是会使用仅从数据库中提取的值来更新记录。
最好简单地遍历查询集,从而维护对相同 ItemsTable
对象的引用:
order_items = ItemsTable.objects.filter(order_id__order_number=order_id)
for i, order_item in enumerate(order_items):
order_item.qty = i + 5
order_item.qty_nextMonth = i + 30
order_item.save()
这也更加有效,因为枚举查询集会强制求值,因此您可以一次获取所有对象。
从django-2.2开始,您可以使用.bulk_update(..)
[Django-doc]来批量更新可迭代的对象。