Django 过滤与排除

发布于 2024-08-24 06:58:02 字数 334 浏览 6 评论 0 原文

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)

是否被认为是更好的做法,或者它们在功能和性能方面是否相同?

Is there a difference between filter and exclude in django? If I have

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

and I want to add another criteria, is there a meaningful difference between to following two lines of code?

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

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

is one considered better practice or are they the same in both function and performance?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

娜些时光,永不杰束 2024-08-31 06:58:02

两者都是惰性评估的,所以我希望它们表现相同。 SQL 可能不同,但没有真正的区别。

Both are lazily evaluated, so I would expect them to perform equivalently. The SQL is likely different, but with no real distinction.

栖迟 2024-08-31 06:58:02

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

Posts.objects.exclude(date__month=3)

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

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

或者您必须使用 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 as

Posts.objects.exclude(date__month=3)

With .filter() it would be (but I not sure whether this actually works):

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

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.

冰火雁神 2024-08-31 06:58:02

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

此处:

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

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

在本例中:

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

首先选择 modelField 值为 x 的条目(user 为 null 且 user 不为 null),然后排除字段 user 为 null 的条目。

我认为在这种情况下最好使用第一个选项,它看起来更干净。但两者的工作原理是一样的。

In general exclude is opposite of filter. In this case both examples works the same.

Here:

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

You select entries that field user is not null and modelField has value x

In this case:

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文