0

我有一个这样的模型:

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

4

1 回答 1

4

正如文档所说,Django 查询集是惰性的:

在内部,可以构造、过滤、切片和传递 QuerySet,而无需实际访问数据库。在您执行某些操作来评估查询集之前,实际上不会发生任何数据库活动。

在您的情况下,直到您开始循环访问数据库或您最终使用它做什么,写入m_seen = M.objects.filter(seen=True)才会进入数据库。那时,未见过的已经更新为可见。

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

于 2013-06-05T14:11:23.743 回答