2012-07-06 25 views
-1

我有以下查詢:Django的多對多查詢集和替代或

things = Thing.objects.filter(tags__in=selected_tags).distinct() 

如果selected_tags看起來是這樣的:

selected_tags = [<Tag: tag1>, <Tag: tag2>] 

那麼事情將包含有標籤1 TAG2或任何東西。

我想要一個查詢,給我的東西有tag1和tag2(甚至可能tag3,但不一定)。做這個的最好方式是什麼?

回答

1

__in本質上是基於OR的。它從字面上說拉出任何有這些標籤的行。要創建一個基於與查詢,你需要單獨篩選每個標籤:

Thing.objects.filter(tags=tag1, tags=tag2, ...) 

這顯然不是理想的,不幸的是,你甚至可以用不擴展詞典在這種情況下,由於所有關鍵的會是一樣的。所以你唯一的選擇就是使用Q

from django.db.models import Q 

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

things = Thing.objects.filter(query) 

這是一個有點convul​​uted,但如果你需要動態地創建查詢(而不是僅僅硬編碼您正在搜索的每個標籤),那麼這是你最好的選擇。