【问题标题】:Django: What's the difference between Queryset.union() and the OR operator?Django:Queryset.union() 和 OR 运算符有什么区别?
【发布时间】:2021-04-19 21:52:50
【问题描述】:

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

考虑以下 2 个查询集:

qs1 = Candidate.objects.filter(id=1)
qs2 = Candidate.objects.filter(id=2)

qs1 | qs2 与 qs1.union(qs2) 有何不同?我错过了一些微妙之处吗?

【问题讨论】:

    标签: python django django-views django-queryset


    【解决方案1】:

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

    如上定义所说 qs1.union(qs2) 它结合了两个查询

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

    【讨论】:

      【解决方案2】:

      这更像是一个 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 来编写它。

      如果您有一个昂贵的查询,当您选择一种格式而不是另一种格式时,时间会有所不同。您可以使用 EXPLAIN 进行实验。在一些测试中,我让 UNION 需要更长的时间才能给你第一行,但完成得更快。

      如果查询优化不是问题,则更常见的是使用 OR。

      【讨论】:

        【解决方案3】:

        来自QuerySet API reference

        union()、intersection() 和 difference() 返回第一个 QuerySet 类型的模型实例,即使参数是其他模型的 QuerySet。

        .union() 方法返回 QuerySet,其架构/列名称仅传递了第一个 QuerySet 参数。 OR(|) 运算符不是这种情况。

        【讨论】:

        • 哦,这也是一个有趣的区别。随意编辑我下面的答案以包括在内。
        【解决方案4】:

        来自QuerySet API reference:

        默认情况下,UNION 运算符仅选择不同的值。要允许重复值,请使用 all=True 参数。

        .union() 方法允许在指定是否保留或消除返回的重复记录方面具有一定的粒度。此选项不适用于 OR 运算符。

        此外,.union() 调用创建的 QuerySet 不能调用 .distinct()。

        【讨论】:

          猜你喜欢
          • 2021-11-08
          • 1970-01-01
          • 2021-11-08
          • 2012-09-09
          • 2010-12-03
          • 1970-01-01
          • 2022-06-10
          • 2018-08-16
          • 2012-10-10
          相关资源
          最近更新 更多