姜戈。从查询集中删除 select_related

Nik*_*nyh 3 python django orm

有没有办法从查询集中删除相关的选择?

我发现,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)

Ala*_*nSE 6

我相信此代码注释为此处提出的一般问题提供了相对较好的答案:

如果调用 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)也无济于事。