【问题标题】:django conjunctive filter __in querydjango conjunctive filter __in 查询
【发布时间】:2012-02-20 22:20:39
【问题描述】:

考虑一个标签数组,T。

每个 PhotoSet 都与标签具有多对多的关系。

我们还有一个过滤器,F(由一组标签组成),我们想要返回所有包含在 F 中的所有标签的 PhotoSet。

即。如果 F = ['green', 'dogs', 'cats'],我们希望每个 PhotoSet 实例都具有 所有 F 中的标签。

自然

PhotoSet.objects.filter(tags__in=F)

不成功,因为它返回 每个 PhotoSet 包含 F 的 any 成员。

我看到使用“Q”表达式可以使用类似的东西,但这似乎只适用于有限数量的合取参数。这是可以使用列表推导来完成的吗?

提前致谢!

编辑——解决方案:

我通过一种显而易见的方式找到了解决方案。简单地链接过滤器...

results = PhotoSets.objects
for f in F:
  results = results.filter(tags__in=[f])
results = results.all()

一直盯着我的脸!

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    有点快速和肮脏,但它会解决问题:

    query = None
    for tag in F:
        if query is None:
            query = Q(tags=tag)
        else:
            query &= Q(tags=tag)
    
    PhotoSet.objects.filter(query)
    

    【讨论】:

    • 感谢您的回复。如果我想出的解决方案不起作用,我会尝试。顺便说一句,您知道哪种方法最有效吗?
    • 它们的效率应该相当。无论哪种方式,数据库实际上只被命中一次,并且查询应该大致相同。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2015-12-30
    • 2018-10-20
    • 2011-11-13
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多