代码之家  ›  专栏  ›  技术社区  ›  Giovanni Di Milia

Django:同一模型上不同查询集的并集

  •  2
  • Giovanni Di Milia  · 技术社区  · 14 年前

    class Serials(models.Model):
        id = models.AutoField(primary_key=True)
        code = models.CharField("Code", max_length=50)
        name = models.CharField("Name", max_length=2000)
    

    我在数据库中有这样的元组:

    1   BOSTON   The new Boston
    2   NYT      New York journal
    3   NEWTON   The old journal of Mass
    4   ANEWVIEW The view of the young people
    

    new ,我想要的是:

    • names 从字符串开始
    • 然后 codes 从字符串开始
    • 姓名 包含字符串的
    • 代码

    因此,前面的列表应按以下方式显示:

    2   NYT      New York journal
    3   NEWTON   The old journal of Mass
    1   BOSTON   The new Boston
    4   ANEWVIEW The view of the young people
    

    现在,由于不同查询集的结构是相同的,所以我想知道是否有方法连接4个查询集并只给模板一个查询集。

    2 回复  |  直到 10 年前
        1
  •  7
  •   Community Tales Farias    7 年前

    您可以进行这四个查询,然后将它们链接到程序中:

    result = itertools.chain(qs1, qs2, qs3, qs4)
    

    但这似乎不太好,因为你必须为查询做准备。

    Serials.objects.raw(sql_string)
    

    请看这个:

    How to combine 2 or more querysets in a Django view?

        2
  •  5
  •   Matthew Schinckel    8 年前

    你也应该能做到 qs1 | qs2 | qs3 | qs4 . 不过,这会给你复制品。

    Q()

    from django.db.models import Q
    value = "new"
    Serials.objects.filter(Q(name__startswith=value) |
                           Q(code__startswith=value) |
                           Q(name__contains=value) |
                           Q(code__contains=value).distinct()
    

    我不确定如果你这样做,它是否能处理订单,因为这将依赖于db来完成。

    事实上,即使使用 qs1 | qs2 可能导致db决定订单。这可能是缺点(也是您可能需要至少两个查询的原因)。