Python 查询中的django连接筛选器
考虑一个标记数组,T 每个PhotoSet都与标记有多对多关系 我们还有一个过滤器F(由一组标签组成),我们希望返回所有包含F中所有标签的照片集 i、 e,。如果F=['green'、'dogs'、'cats'],我们希望每个PhotoSet实例都具有F中的所有标记 自然地Python 查询中的django连接筛选器,python,django,django-queryset,Python,Django,Django Queryset,考虑一个标记数组,T 每个PhotoSet都与标记有多对多关系 我们还有一个过滤器F(由一组标签组成),我们希望返回所有包含F中所有标签的照片集 i、 e,。如果F=['green'、'dogs'、'cats'],我们希望每个PhotoSet实例都具有F中的所有标记 自然地 PhotoSet.objects.filter(tags__in=F) 不执行此操作,因为它返回包含F的任何成员的每个PhotoSet 我知道可以用“Q”表达式使用类似的东西,但这似乎只适用于有限数量的连接参数。这是可以通
PhotoSet.objects.filter(tags__in=F)
不执行此操作,因为它返回包含F的任何成员的每个PhotoSet
我知道可以用“Q”表达式使用类似的东西,但这似乎只适用于有限数量的连接参数。这是可以通过列表理解来完成的吗
提前谢谢
编辑--解决方案:
我用一种显而易见的方法找到了解决办法。简单地链接过滤器
results = PhotoSets.objects
for f in F:
results = results.filter(tags__in=[f])
results = results.all()
一直盯着我的脸看 有点快,有点脏,但它会起作用:
query = None
for tag in F:
if query is None:
query = Q(tags=tag)
else:
query &= Q(tags=tag)
PhotoSet.objects.filter(query)
谢谢你的回复。如果我想出的解决方案不起作用,我会试试的。顺便说一句,你知道哪种方法最有效吗?它们的效率应该相当。无论哪种方式,数据库实际上只被命中一次,查询应该大致相同。