动态更新的查询集?

时间:2013-06-05 14:07:54

标签: django django-models

我有一个这样的模型:

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会自动更新,以包含之前“未见”的所有条目。我不希望更新查询集。这可能吗?

1 个答案:

答案 0 :(得分:4)

Django查询集很懒,因为documentation说:

  

在内部,可以构造,过滤,切片并通常传递QuerySet而不实际访问数据库。在您执行评估查询集的操作之前,实际上不会发生数据库活动。

在你的情况下,写入m_seen = M.objects.filter(seen=True)之前不会进入数据库,直到你开始循环它或者你最终用它做什么。那时,未见过的已经更新到了。

文档继续讨论pickling以及强制查询QuerySet的其他方法。在您的情况下,您可能只想在QuerySet上调用list(),请注意这会将所有结果加载到内存中。