Django过滤器vs排除

Enr*_*ico 27 django django-queryset

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

self.get_query_set().filter(modelField=x)
Run Code Online (Sandbox Code Playgroud)

我想添加另一个标准,下面两行代码之间有什么有意义的区别吗?

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

self.get_query_set().filter(modelField=x).exclude(user__isnull=True)
Run Code Online (Sandbox Code Playgroud)

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

Ned*_*der 23

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

  • @Enrico:不是,这取决于你想要什么.看我的回答.在这种情况下,性能无关紧要,它们是两种用于不同目的的方法.对于SQL生成,文档说``.exclude()`:*多个参数通过基础SQL语句中的AND连接,整个事件都包含在NOT()中.* (2认同)

Dom*_*opa 20

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

这里:

self.get_query_set().filter(user__isnull=False, modelField=x)
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下:

self.get_query_set().filter(modelField=x).exclude(user__isnull=True)
Run Code Online (Sandbox Code Playgroud)

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

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


Fel*_*ing 15

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

Posts.objects.exclude(date__month=3)
Run Code Online (Sandbox Code Playgroud)

有了.filter()它(但我不确定这是否真的有效):

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

或者你必须使用一个Q对象.

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