Django过滤器vs排除

时间:2010-03-11 03:38:41

标签: django django-queryset

django中filter和exclude之间有区别吗?如果我有

self.get_query_set().filter(modelField=x)

并且我想添加另一个标准,以下两行代码之间是否存在有意义的差异?

self.get_query_set().filter(user__isnull=False, modelField=x)

self.get_query_set().filter(modelField=x).exclude(user__isnull=True)

是一种被认为是更好的做法,还是在功能和性能方面都相同?

3 个答案:

答案 0 :(得分:22)

两者都被懒惰地评估,所以我希望它们能够等效地执行。 SQL可能不同,但没有真正的区别。

答案 1 :(得分:17)

一般而言,排除与过滤器相反。在这种情况下,两个示例的工作原理相同。

下面:

self.get_query_set().filter(user__isnull=False, modelField=x)

您选择字段user不为null且modelField值为x

的条目

在这种情况下:

self.get_query_set().filter(modelField=x).exclude(user__isnull=True)

首先,您选择modelField具有值x的条目(用户均为null且user不为空),然后排除具有字段user null的条目。

我认为在这种情况下最好使用第一个选项,它看起来更清洁。但两者都是一样的。

答案 2 :(得分:12)

这取决于你想要达到的目标。使用布尔值,可以在.exclude().filter()之间切换,但是例如如果你想获得除三月以外的所有文章?您可以将查询编写为

Posts.objects.exclude(date__month=3)

使用.filter()会是(但我不确定这是否真的有效):

Posts.objects.filter(date__month__in=[1,2,4,5,6,7,8,9,10,11,12])

或者您必须使用Q对象。

正如函数名称已建议,.exclude()用于从结果集排除数据集。对于布尔值,您可以轻松地将其反转并使用.filter()代替,但对于其他值,这可能更棘手。