2014-10-08 73 views
3

我正在构建一个小型任务管理器,所有任务都有标签。我需要选择所有有几个标签的任务。目前,我做:Django ManyToMany关系“包含”声明

tasks = Task.objects.all().filter(labels__in=label_list).distinct() 

返回的所有任务,其中至少一个标签也是label_list,但我只需要的是具有在label_list所有标签的任务。

更精确的例子:如果我路过[“1”,“2”]作为label_list,我希望所有任务具有或者被退回标签1个OR标签2(这就是正在发生),但希望返回具有标签1 AND标签2的所有任务。

我想这标签的任务包含标签列表

的关系任务标签是多对多:

class Task(models.Model): 
    .... 
    labels = models.ManyToManyField(Label, null=True, blank = True) 
    .... 
+0

相似的问题[这里](http://stackoverflow.com/questions/13270513/django-manytomany-filter-matching-on-all-items-in-a-list)。选定的答案会适合你,虽然很拗口,但它很有创意。 – dgel 2014-10-08 22:57:17

回答

1

这是达到Django的ORM的限制,但你可以尝试:

labels = ['1', '2'] 
qs = Task.objects.all() 
for label in labels: 
    qs = qs.filter(labels=label).distinct() 

显然非常丑陋,对于很长的标签列表来说这是一个非常昂贵的操作,但它可能会让你通过。

或者,您可以查看django-taggit这是一个成熟的django标记应用程序,它提供了类似的“标签”功能。他们通过使用原始SQL来处理“包含”问题。