2014-10-08 72 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來處理「包含」問題。