2012-02-20 43 views
0

考虑一个标签数组,T。django conjunctive filter __in查询

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

我们也有一个过滤器,F(由一组标签的),我们想返回谁已包含在F.

即所有标签全部的photosets ,.如果F = [ '绿色', '狗', '猫'],我们希望有所有在F.

标签每PhotoSet例如自然

不会做的伎俩,因为它返回 PhotoSet包含F.

我看到它可以利用“Q”表达式中使用类似的事情的任何成员,但似乎只针对合取参数数量是有限的。这是否可以使用列表理解来完成?

在此先感谢!

编辑 - 解决方案:

我发现解决方案使用一种明显的方式。简单地链接过滤器...

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

盯着我整个时间!

回答

2

小快速和肮脏的,但它会做的伎俩:

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

PhotoSet.objects.filter(query) 
+0

感谢您的答复。如果我想出的解决方案不起作用,我会尝试。哪个顺便说一下,你知道哪种方法最有效吗? – 2012-02-20 22:37:56

+0

它们的效率应该相当。无论哪种方式,数据库实际上只被击中一次,查询应该大致相同。 – 2012-02-20 22:41:57