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)
是一种被认为是更好的做法,还是在功能和性能方面都相同?
答案 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()
代替,但对于其他值,这可能更棘手。