代码之家  ›  专栏  ›  技术社区  ›  Roman Starkov

如何在Django中按“存在”进行“过滤”?

  •  5
  • Roman Starkov  · 技术社区  · 15 年前

    我想根据某个子查询是否返回任何结果来筛选查询集。在SQL中,可能如下所示:

    SELECT * FROM events e WHERE EXISTS
        (SELECT * FROM tags t WHERE t.event_id = e.id AND t.text IN ("abc", "def"))
    

    换句话说,检索用指定标记之一标记的所有事件。

    我如何在模型上使用django的queryset api来表达这一点呢? Event Tag ?

    2 回复  |  直到 12 年前
        1
  •  12
  •   Manoj Govindan    15 年前

    你可以这样做:

    q = Event.objects.filter(tag__text__in = ['abc', 'def'])
    

    假设有一个 ForeignKey Tag Event .

    解释 :您正在筛选 事件 基于特定条件的对象。使用双下划线语法访问 text 的属性 标签 实例,然后附加 IN 条件。你不必担心加入外键;Django在幕后为你做这些。如果您希望看到生成的查询,可以打印它:

    print q.query
    
        2
  •  5
  •   Josh Bleecher Snyder    14 年前

    当一个事件有多个标签时,Manoj的解决方案可能会导致问题。

    SQL内部联接返回所有行,因此事件可能有重复的结果,解决方案是添加distinct方法。

    q = Event.objects.filter(tag__text__in = ['abc', 'def']).distinct()