我看到clone()在django代码中被广泛使用
queryset.query.clone()
queryset.clone()
它是什么,我应该模仿查询集或管理器方法中的行为吗?
答案 0 :(得分:13)
正如Kevin在his answer中指出的那样,clone()
方法不是Django API的文档部分。但是,all()
method已完整记录,可以从clone()
执行您想要的操作。
所有()
返回当前QuerySet(或QuerySet子类)的副本。这在您可能希望传入模型管理器或QuerySet并对结果进行进一步过滤的情况下非常有用。在任一对象上调用all()之后,你肯定会有一个QuerySet来使用。
评估QuerySet时,它通常会缓存其结果。如果自评估QuerySet以来数据库中的数据可能已更改,则可以通过在先前评估的QuerySet上调用all()来获取同一查询的更新结果。
答案 1 :(得分:10)
clone()
有两个主要原因:
它允许链接。当您将chain个查询集放在一起时(例如,多个filter()
调用),每次您可以修改时,都需要查询集的新副本。
它允许您避免陈旧的缓存结果。由于查询集cache在评估它们时会产生结果,如果要确保再次访问数据库,则需要克隆查询集。
如果您知道自己在做什么,可以使用它,但请注意,它不是公共API。在这个有趣的Django developers thread中,开发人员谈论clone()
是否应该公开。他们决定反对,部分原因是:
公共
.clone()
方法的最大问题是私有._clone()
不仅仅是克隆。在某些情况下,克隆也会改变QuerySet的行为方式。