【问题标题】:Q queries in DjangoDjango 中的 Q 查询
【发布时间】:2014-08-12 09:08:41
【问题描述】:

如果我有以下查询

return Table.objects.filter(Q(cond1) | Q(cond2))

有没有办法知道哪个条件给出了特定的行?

【问题讨论】:

  • 我需要查询不同的表,它们都共享原始表中的 PK 列。谢谢。
  • 顺便说一句,问题的当前标题('Django 中的 Q 查询')应该更具体。

标签: django django-models django-views django-q


【解决方案1】:

不是真的,不。您的查询大致相当于以下 SQL:

SELECT *
FROM Table
WHERE condition OR other_condition

就像您的 django 查询一样,没有自然指标可以让您知道该特定关系的哪个条件恰好为真。您要么必须执行两个查询,要么向关系添加额外信息(条件),要么使用条件本身。

c1 = Q('name__exact'='Bob')  # condition 1
c2 = Q('name__exact'='Mary') # condition 2

# use separate queries
set1 = Table.objects.filter(c1)  # meets condition 1
set2 = Table.objects.filter(c2)  # meets condition 2

# or use the natural condition
both = Table.objects.filter(c1|c2)
for item in both:
    if item.name == 'Bob':
        # condition 1
    elif item.name == 'Mary':
        # condition 2

【讨论】:

    【解决方案2】:

    您可以将查询拆分为两个查询:

    qs1 = Table.objects.filter(cond1).extra(select={'condition': 'cond1'})
    qs2 = Table.objects.filter(cond2).extra(select={'condition': 'cond2'})
    

    然后创建查询集的联合:

    qs12 = qs1 | qs2

    已编辑:使用 extra() 的查询集之间不支持联合

    然后创建一个查询集链:

    from itertools import chain
    
    qs12 = list(chain(qs1, qs2))
    

    并像这样使用它:

    for obj in qs12:
        if obj.condition == 'cond1':
            ...
        elif obj.condition == 'cond2':
            ...
    

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 2012-09-04
      • 2015-11-12
      • 2012-10-16
      • 2014-02-06
      • 2015-07-15
      • 2017-03-20
      • 2010-12-27
      • 2015-06-23
      相关资源
      最近更新 更多