在 Django 中访问数据库之前组合和切片 2 个查询集
Combining and slicing 2 querysets before hitting the database in Django
我正在尝试通过合并两个查询集来获取查询集。条件如下:
- 仅拉取 20 个项目
- 只命中一次数据库
- 生成的查询集必须与我在这个问题中的代码产生的对象相同
假设我有一个名为 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
它将允许您检查命中数据库的查询
我正在尝试通过合并两个查询集来获取查询集。条件如下:
- 仅拉取 20 个项目
- 只命中一次数据库
- 生成的查询集必须与我在这个问题中的代码产生的对象相同
假设我有一个名为 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
它将允许您检查命中数据库的查询