我有一个这样的模型:
class M(models.Model):
...
seen = models.BooleanField()
...
def set_seen(self):
self.seen = True
self.save()
然后我在views.py函数中有这段代码:
m_not_seen = M.objects.filter(seen=False)
m_seen = M.objects.filter(seen=True)
for m in m_not_seen:
m.set_seen()
执行完最后一行后,似乎m_seen会自动更新,以包含之前“未见”的所有条目。我不希望更新查询集。这可能吗?
答案 0 :(得分:4)
Django查询集很懒,因为documentation说:
在内部,可以构造,过滤,切片并通常传递QuerySet而不实际访问数据库。在您执行评估查询集的操作之前,实际上不会发生数据库活动。
在你的情况下,写入m_seen = M.objects.filter(seen=True)
之前不会进入数据库,直到你开始循环它或者你最终用它做什么。那时,未见过的已经更新到了。
文档继续讨论pickling以及强制查询QuerySet的其他方法。在您的情况下,您可能只想在QuerySet上调用list()
,请注意这会将所有结果加载到内存中。