2015-06-19 65 views
1

假設我有以下型號:Django的查詢集多約束

class User(models.Model): 
    # ... some fields 

class Tag(models.Model): 
    # ... some fields 

class UserTag(models.Model): 
    user = models.ForeignKey(User, related_name='tags') 
    tag = models.ForeignKey(Tag, related_name='users') 
    date_removed = models.DateTimeField(null=True, blank=True) 

現在我可以說,我想一切都還沒有被刪除的指定標籤的用戶(即date_removed =無)。如果我沒有擔心date_removed約束,我可以這樣做:

User.objects.filter(tags__tag=given_tag) 

但我想誰有定標籤有標籤不就可以了date_removed所有用戶。 Django中有一個簡單的方法可以在單個查詢集中實現嗎?假設我有數百萬用戶,因此獲取任何用戶名列表並將其保存在內存中都是不實際的。

回答

3

filter()調用可以包括多個約束:

User.objects.filter(tags__tag=given_tag, tags__date_removed=None) 

當它們匹配時,他們都將匹配到相同Tag,而不是兩個可能不同的人。

請參閱the documentation關於跨越多值關係; ,特別是filter(a, b)filter(a).filter(b)之間的差異。

+0

輝煌,正是我所期待的 - 只是無法在文檔中找到它。謝謝! – samskeller

+0

「filter(a,b)」和「filter(a).filter(b)」可以不同的(非常重要的)事實是Django最令人驚訝的特性之一。第一次閱讀文檔時容易忽略,即使您認爲自己正在徹底地做到這一點。 –