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

eug*_*ene 13 django django-queryset

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

queryset.query.clone()  
queryset.clone()
Run Code Online (Sandbox Code Playgroud)

它是什么,我应该模仿我的queryset或manager方法中的行为?

Don*_*kby 17

正如Kevin在他的回答中指出的那样,该clone()方法不是Django API的文档部分.但是,该all()方法已完整记录,并且可以完成您想要的操作clone().

所有()

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

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

  • 在1.9.6中,`all()`调用内部`_clone`方法:https://github.com/django/django/blob/1.9.6/django/db/models/query.py#L783相关问题:http://stackoverflow.com/questions/22804252/django-orm-objects-filter-vs-objects-all-filter-which-one-is-preferre (4认同)

Kev*_*nry 11

主要原因有两个clone():

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

  2. 它允许您避免过时的缓存结果.由于查询集在评估结果时会缓存其结果,因此如果要确保再次访问数据库,则需要克隆查询集.

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

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