过滤查询集中的空名称或 NULL 名称
-
20-08-2019 - |
题
我有需要搜索的名字、姓氏和别名(可选)。因此,我需要一个查询来为我提供所有设置了别名的名称。
只要我能做到:
Name.objects.filter(alias!="")
那么,上面的等价于什么呢?
解决方案
你可以这样做:
Name.objects.exclude(alias__isnull=True)
如果需要排除空值 和 空字符串,首选方法是将条件链接在一起,如下所示:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
将这些方法链接在一起基本上可以独立检查每个条件:在上面的示例中,我们排除了其中的行 alias
要么为空 或者 一个空字符串,所以你得到了所有 Name
具有非空、非空的对象 alias
场地。生成的 SQL 看起来像这样:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
您还可以将多个参数传递给单个调用 exclude
, ,这将确保只有满足的对象 每一个 条件被排除:
Name.objects.exclude(some_field=True, other_field=True)
在这里,行 some_field
和 other_field
为 true 时被排除,因此我们得到两个字段都不为 true 的所有行。生成的 SQL 代码看起来有点像这样:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
或者,如果你的逻辑比这更复杂,你可以使用 Django 的 Q 对象:
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
欲了解更多信息,请参阅 这一页 和 这一页 在 Django 文档中。
作为旁白:我的 SQL 示例只是一个类比——实际生成的 SQL 代码可能看起来有所不同。通过实际查看它们生成的 SQL,您将更深入地了解 Django 查询的工作原理。
其他提示
Name.objects.filter(alias__gt='',alias__isnull=False)
首先,Django文档强烈建议不使用NULL值基于字符串的字段,诸如CharField或TextField更新。阅读说明的文档:
https://docs.djangoproject.com/en/dev / REF /模型/场/#空
解决方案: 你也可以连接在一起的查询集的方法,我想。尝试这样:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
这应该给你你正在寻找的设置。
从Django的1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
要使用exclude
时避免常见的错误,请记住:强>
可以的不添加的多个强>条件成的一个排除()强>块等filter
。
为了排除多个条件,必须使用多个排除()
示例强>
<强>不正确强>:
User.objects.filter(email='example@example.com ')。排除(profile__nick_name ='”, profile__avt = '')
<强>正确强>:
User.objects.filter(email='example@example.com ')。排除(profile__nick_name =' ')。排除(profile__avt ='')
这是另一种简单的方法来做到这一点。
Name.objects.exclude(alias=None)
您可以简单地这样做:
Name.objects.exclude(alias="").exclude(alias=None)
这真的就是这么简单。 filter
用于匹配和exclude
是匹配一切,但它指定。这将评估为SQL作为NOT alias='' AND alias IS NOT NULL
。