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可能不同,但没有真正的区别.
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()
,但对于其他值,这可能更棘手.
归档时间: |
|
查看次数: |
38328 次 |
最近记录: |