考虑一组标签,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()
一直盯着我的脸!
答案 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)