有没有办法从查询集中删除相关的选择?
我发现,django 将 JOIN 在 count() 操作上添加到 sql 查询。所以,如果我们有这样的代码:
entities = Entities.objects.select_related('subentity').all()
#We will have INNER JOIN here..
entities.count()
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种删除连接的方法。一个重要的细节——我把这个查询集放到了 django 分页器中,所以我不能简单地写
Entities.objects.all().count()
Run Code Online (Sandbox Code Playgroud)
我相信此代码注释为此处提出的一般问题提供了相对较好的答案:
如果调用 select_related(None),则清除列表。
https://github.com/django/django/blob/stable/1.8.x/django/db/models/query.py#L735
一般来说,如果你想对查询集做一些事情entities,但首先从中删除 select_related 项,entities.select_related(None).
但是,这可能无法解决您使用分页器的特定情况。如果你这样做entries.count(),那么它已经将删除 select_related 项目。如果您发现自己发生了额外的 JOIN,那么这可能是几个不理想的因素。可能是 ORM 无法删除它,因为与 select_related 结合时可能会或可能不会影响计数的其他逻辑。
作为这些非理想情况之一的简单示例,请考虑Foo.objects.select_related('bar').count()vs Foo.objects.select_related('bar').distinct().count()。原始查询集不包含多个条目对您来说可能很明显,但对 Django ORM 来说并不明显。因此,执行的 SQL 包含一个 JOIN,并且没有通用的方法来解决这个问题。即使申请.select_related(None)也无济于事。
| 归档时间: |
|
| 查看次数: |
2079 次 |
| 最近记录: |