2015-06-19 83 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最令人惊讶的特性之一。第一次阅读文档时容易忽略,即使您认为自己正在彻底地做到这一点。 –