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

时间:2018-10-09 14:50:35

标签: django django-orm

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

  • 仅拉出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]

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

注意:我知道无需合并查询集就可以完成此操作,但是出于这个问题的考虑,让我们假设拥有2个这样的查询集是绝对必要的。

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

1 个答案:

答案 0 :(得分:1)

是的,正如您所说的那样。 This是查询集联合的未记录实现。它只会打一次数据库。

您可以通过print(qs.query)

验证其是否被强制执行为一个查询。

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

from django.db import connection
connection.queries

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