在 Django 中访问数据库之前组合和切片 2 个查询集

Combining and slicing 2 querysets before hitting the database in Django

我正在尝试通过合并两个查询集来获取查询集。条件如下:

假设我有一个名为 MyModel 的模型,其中有一个名为 value 的字段存储整数,但是,该值可以为 null。

我知道 Django 中的查询集是惰性的,但我不确定以下代码行是否满足条件。

qs = MyModel.objects.exclude(value__isnull=True).filter(value__gte=250).order_by('-value') | MyModel.objects.exclude(value__isnull=False)
objects = qs[:20]

基本上,我首先过滤掉值不为空的地方,根据值对它们进行排序,然后在最后添加排除的那些。这符合我的条件吗?也就是说,数据库是否被命中一次?此外,如果没有 | 运算符,是否有更好的方法来执行此操作?

注意:我知道这可以在不合并查询集的情况下完成,但是为了这个问题,让我们假设拥有 2 个这样的查询集是绝对必要的。

编辑:添加了第三个条件,我认为这是隐含的。我的错。

是的,正如您所说的那样有效。 This 是查询集并集的未记录实现。它只会访问数据库一次。

您可以通过 print(qs.query)

验证它是否被强制到一个查询中

我还建议检查 FAQ: How can I see the raw SQL queries Django is running?

from django.db import connection
connection.queries

它将允许您检查命中数据库的查询