如果其中一个查询集为空,则两个查询集的并集将导致编程错误



为了保存一些数据库命中率,我尝试使用django-union将两个查询集合并为一个,如下所示:

qs1 = Model1.objects.filter(...) # complicated stuff going on here
qs2 = Model2.objects.filter(...) # complicated stuff going on here
qs1.union(qs2)

当然,我要确保两个查询集中的字段是相同的。当查询集不为空时,我的代码工作正常——我收到一个包含所有字段的合并查询集。

只有当任意一个查询集恰好为空时,才会出现此问题。当这种情况发生时,我收到:

def _execute(self, sql, params, *ignored_wrapper_args):
self.db.validate_no_broken_transaction()
with self.db.wrap_database_errors:
if params is None:
return self.cursor.execute(sql)
else:
>               return self.cursor.execute(sql, params)
E               django.db.utils.ProgrammingError: each UNION query must have the same number of columns
E               LINE 1: ...app_model1"."id" IS NULL)) UNION (SELECT "app_model1...
E                                                                            ^
/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py:84: ProgrammingError

我觉得即使没有记录,列也应该留在查询集中。有什么办法做到这一点吗?

您尝试过使用管道运算符吗?

qs3 = qs1 | qs2

这不使用SQL来执行UNION,而是在返回后加入中的查询集

最新更新