django - save() 不更新数据库中的表
问题描述
每次用户访问页面时,我都必须更新数据库中的 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()
谁能告诉代码的第二部分出了什么问题。它没有更新数据库。
解决方案
每次编写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]批量更新对象的可迭代对象。