在合并QuerySets时,QuerySet.union()
方法和在QuerySets之间使用OR运算符 |
有什么区别?
考虑以下两个QuerySets:
qs1 = Candidate.objects.filter(id=1)
qs2 = Candidate.objects.filter(id=2)
< p > qs1 | qs2
与 qs1.union(qs2)
有什么不同?它们之间是否存在一些我没有注意到的细微差别呢?
在合并QuerySets时,QuerySet.union()
方法和在QuerySets之间使用OR运算符 |
有什么区别?
考虑以下两个QuerySets:
qs1 = Candidate.objects.filter(id=1)
qs2 = Candidate.objects.filter(id=2)
< p > qs1 | qs2
与 qs1.union(qs2)
有什么不同?它们之间是否存在一些我没有注意到的细微差别呢?
union()
、intersection()
和difference()
方法,即使参数是其他模型的 QuerySet,也会返回第一个 QuerySet 的模型实例。
.union() 方法返回的 QuerySet 仅包含传入的第一个 QuerySet 参数的模式/列名称。但是,OR(|)运算符不具备这种特性。
UNION 运算符默认只选择不同的值。如需允许重复值,请使用 all=True 参数。
.union()
方法允许在指定保留还是排除返回的重复记录上进行一定的细化。使用 OR 运算符无法进行此选择。
此外,通过 .union()
调用创建的 QuerySets 不能调用 .distinct()
方法。
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 运算符用于组合两个或多个查询集的结果集。这些查询集可以来自相同的模型或者不同的模型。当这些查询集来自不同的模型时,字段及其数据类型应该匹配。
如上面定义所说的 qs1.union(qs2) 它会组合这两个查询集
但是 OR 运算符用于查找布尔值,它不会组合查询,而只会检查它们是真还是假,并且对于 OR 运算符,数据/查询应该来自一个模型。