Django:Queryset.union()和OR运算符有什么区别?

8

在合并QuerySets时,QuerySet.union()方法和在QuerySets之间使用OR运算符 |有什么区别?

考虑以下两个QuerySets:

qs1 = Candidate.objects.filter(id=1)
qs2 = Candidate.objects.filter(id=2)
< p > qs1 | qs2qs1.union(qs2) 有什么不同?它们之间是否存在一些我没有注意到的细微差别呢?

4个回答

9

QuerySet API 参考文档

union()intersection()difference() 方法,即使参数是其他模型的 QuerySet,也会返回第一个 QuerySet 的模型实例。

.union() 方法返回的 QuerySet 仅包含传入的第一个 QuerySet 参数的模式/列名称。但是,OR(|)运算符不具备这种特性。


哦,这也是一个有趣的区别。你可以随意编辑下面的答案,将其包含在内。 - jidicula

7

来自QuerySet API 参考文档

UNION 运算符默认只选择不同的值。如需允许重复值,请使用 all=True 参数。

.union() 方法允许在指定保留还是排除返回的重复记录上进行一定的细化。使用 OR 运算符无法进行此选择。

此外,通过 .union() 调用创建的 QuerySets 不能调用 .distinct() 方法。


4
这更像是一道SQL问题而不是Django问题。在你贴出的例子中,Django ORM将把qs1 | qs2翻译成类似于以下内容:
SELECT * FROM candidate WHERE id=1 OR id=2

而在qs1.union(qs2)中,它会变成类似于

SELECT * FROM candidate WHERE id=1 UNION SELECT * FROM candidate WHERE id=2

在这个特定的例子中,使用UNION与使用OR没有区别,但我认为没有人会使用UNION。
如果您有一个耗时的查询,在选择一种格式而不是另一种格式时会出现时间上的差异。您可以使用EXPLAIN来进行实验。在某些测试中,我发现UNION需要更长的时间才能给出第一行结果,但是完成速度稍微快一些。
如果查询优化不是问题,使用OR更加常见。

-1

UNION 运算符用于组合两个或多个查询集的结果集。这些查询集可以来自相同的模型或者不同的模型。当这些查询集来自不同的模型时,字段及其数据类型应该匹配。

如上面定义所说的 qs1.union(qs2) 它会组合这两个查询集

但是 OR 运算符用于查找布尔值,它不会组合查询,而只会检查它们是真还是假,并且对于 OR 运算符,数据/查询应该来自一个模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接