django conjunctive filter __in查询

时间:2012-02-20 22:20:39

标签: python django django-queryset

考虑一组标签,T。

每个PhotoSet与Tags都有多对多的关系。

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

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

自然

PhotoSet.objects.filter(tags__in=F)

不会这样做,因为它返回每个 PhotoSet包含任何成员。

我看到使用“Q”表达式可以使用类似的东西,但这似乎只是有限量的连接参数。这是否可以使用列表理解来完成?

提前致谢!

编辑 - 解决方案:

我用一种明显的方式找到了解决方案。简单地链接过滤器...

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

一直盯着我的脸!

1 个答案:

答案 0 :(得分:2)

快点和肮脏,但它会做到这一点:

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

PhotoSet.objects.filter(query)