Django 过滤与排除
django 中的过滤和排除有区别吗?如果我有
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)
是否被认为是更好的做法,或者它们在功能和性能方面是否相同?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
两者都是惰性评估的,所以我希望它们表现相同。 SQL 可能不同,但没有真正的区别。
Both are lazily evaluated, so I would expect them to perform equivalently. The SQL is likely different, but with no real distinction.
这取决于您想要实现什么目标。使用布尔值,可以轻松在
.exclude() 之间切换
和.filter()
但是,例如,如果您想获取除三月份的文章之外的所有文章呢?您可以将查询编写为With
.filter()
(但我不确定这是否真的有效):或者您必须使用
Q
对象。正如函数名称所示,
.exclude()
用于从结果集中排除数据集。对于布尔值,您可以轻松地反转它并使用.filter()
代替,但对于其他值,这可能会更加棘手。It depends what you want to achieve. With boolean values it is easy to switch between
.exclude()
and.filter()
but what about e.g. if you want to get all articles except those from March? You can write the query asWith
.filter()
it would be (but I not sure whether this actually works):or you would have to use a
Q
object.As the function name already suggest,
.exclude()
is used to exclude datasets from the resultset. For boolean values you can easily invert this and use.filter()
instead, but for other values this can be more tricky.一般来说,排除与过滤相反。在这种情况下,两个示例的工作原理相同。
此处:
您选择字段 user 不为空且 modelField 值为 x 的条目
在本例中:
首先选择 modelField 值为 x 的条目(user 为 null 且 user 不为 null),然后排除字段 user 为 null 的条目。
我认为在这种情况下最好使用第一个选项,它看起来更干净。但两者的工作原理是一样的。
In general exclude is opposite of filter. In this case both examples works the same.
Here:
You select entries that field user is not null and modelField has value x
In this case:
First you select entries that modelField has value x(both user in null and user is not null), then you exclude entries that have field user null.
I think that in this case it would be better use first option, it looks more cleaner. But both work the same.