- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近在过滤器中发现了一些奇怪的东西,我不敢相信它的预期行为。
from django.contrib.auth.models import User
print User.objects.filter(id__in=User.objects.none().values_list("id",flat=True))
print User.objects.filter(id__in=User.objects.all().values_list("id",flat=True))
奇怪的是,这两个列表都返回完整的用户集。如果我将内部查询包装在列表函数中,那么“修复”实际上似乎很容易,例如
User.objects.filter(id__in=list(User.objects.none().values_list("id")))
然后这将返回我所期望的内容(一个空列表)。
对我来说似乎是一个错误,或者我错过了什么?
史蒂夫
最佳答案
以下是为两者生成的查询:
User.objects.filter(id__in=User.objects.none().values_list("id",flat=True))
SELECT "auth_user"."id",
"auth_user"."username",
"auth_user"."first_name",
"auth_user"."last_name",
"auth_user"."email",
"auth_user"."password",
"auth_user"."is_staff",
"auth_user"."is_active",
"auth_user"."is_superuser",
"auth_user"."last_login",
"auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" IN
(SELECT U0."id"
FROM "auth_user" U0) LIMIT 21
User.objects.filter(id__in=User.objects.all().values_list("id",flat=True))
SELECT "auth_user"."id",
"auth_user"."username",
"auth_user"."first_name",
"auth_user"."last_name",
"auth_user"."email",
"auth_user"."password",
"auth_user"."is_staff",
"auth_user"."is_active",
"auth_user"."is_superuser",
"auth_user"."last_login",
"auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" IN
(SELECT U0."id"
FROM "auth_user" U0) LIMIT 21
注意到什么了吗?它们是完全相同相同的查询。同样有趣的是,如果您尝试像 User.objects.none()
这样的事情会发生什么? , User.objects.filter(id__in=[])
和User.objects.filter(id__in=User.objects.none()
。在所有这三种情况下,Django 都会短路查询。换句话说,它甚至不会向数据库发出查询,因为它事先确定不会有任何结果。我最好的猜测是添加 values_list
到最后击败了短路逻辑,允许发送实际的查询,并且它实际上是 values_list
确定应发送的查询。当您仔细考虑时,这两种情况实际上是相同的。无论哪种方式,您只想选择 id
在未过滤的查询集上。
我强调了这一部分,因为我确信你现在会跳上跳下地说但是none
应该返回一个空的查询集。确实如此,但它是通过自动返回 EmptyQuerySet
来实现这一点的。并且根本没有真正查询数据库。它不会向查询添加任何过滤器。
这是否是一个错误是有争议的。我更倾向于将其称为边缘情况,很可能无法真正“修复”。这是在这个场景中所有交织部分如何组合在一起的函数。
关于django - 查询集过滤器中使用的 EmptyQuerySet 上的 value_list 返回完整集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11578852/
最近在过滤器中发现了一些奇怪的东西,我不敢相信它的预期行为。 from django.contrib.auth.models import User print User.objects.filter
在 django 中,我想根据其他一些对象的属性从数据库中检索对象。如果其他对象之一不存在,则不应影响查询结果。代码是这样的: from django.db.models import Q try:
我是一名优秀的程序员,十分优秀!