什么是django中的query.clone(),queryset.clone()?

时间:2014-01-27 15:48:39

标签: django django-queryset

我看到clone()在django代码中被广泛使用

queryset.query.clone()  
queryset.clone()

它是什么,我应该模仿查询集或管理器方法中的行为吗?

2 个答案:

答案 0 :(得分:13)

正如Kevin在his answer中指出的那样,clone()方法不是Django API的文档部分。但是,all() method已完整记录,可以从clone()执行您想要的操作。

  

所有()

     

返回当前QuerySet(或QuerySet子类)的副本。这在您可能希望传入模型管理器或QuerySet并对结果进行进一步过滤的情况下非常有用。在任一对象上调用all()之后,你肯定会有一个QuerySet来使用。

     

评估QuerySet时,它通常会缓存其结果。如果自评估QuerySet以来数据库中的数据可能已更改,则可以通过在先前评估的QuerySet上调用all()来获取同一查询的更新结果。

答案 1 :(得分:10)

clone()有两个主要原因:

  1. 它允许链接。当您将chain个查询集放在一起时(例如,多个filter()调用),每次您可以修改时,都需要查询集的新副本。

  2. 它允许您避免陈旧的缓存结果。由于查询集cache在评估它们时会产生结果,如果要确保再次访问数据库,则需要克隆查询集。

  3. 如果您知道自己在做什么,可以使用它,但请注意,它不是公共API。在这个有趣的Django developers thread中,开发人员谈论clone()是否应该公开。他们决定反对,部分原因是:

      

    公共.clone()方法的最大问题是私有._clone()不仅仅是克隆。在某些情况下,克隆也会改变QuerySet的行为方式。