un3*_*33k 444 django null filter django-models django-queryset
我有first_name,last_name和别名(可选)我需要搜索.所以,我需要一个查询来给我所有具有别名集的名称.
只有我能做到:
Name.objects.filter(alias!="")
Run Code Online (Sandbox Code Playgroud)
那么,与上述相同的是什么?
Sas*_*gov 809
你可以这样做:
Name.objects.exclude(alias__isnull=True)
Run Code Online (Sandbox Code Playgroud)
如果您需要排除空值和空字符串,那么首选方法是将条件链接在一起,如下所示:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Run Code Online (Sandbox Code Playgroud)
将这些方法链接在一起基本上可以独立地检查每个条件:在上面的示例中,我们排除其中alias
为null 或空字符串的行,因此您将获得Name
具有非null,非空alias
字段的所有对象.生成的SQL看起来像:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Run Code Online (Sandbox Code Playgroud)
您还可以将多个参数传递给单个调用exclude
,这将确保只排除满足每个条件的对象:
Name.objects.exclude(some_field=True, other_field=True)
Run Code Online (Sandbox Code Playgroud)
在这里,排除了哪些some_field
和 哪些other_field
是真的行,所以我们得到两个字段都不为真的所有行.生成的SQL代码看起来有点像这样:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
Run Code Online (Sandbox Code Playgroud)
或者,如果您的逻辑比这更复杂,您可以使用Django的Q对象:
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Run Code Online (Sandbox Code Playgroud)
暂且不说:我的SQL示例只是一个类比 - 实际生成的SQL代码可能看起来不同.通过实际查看它们生成的SQL,您将更深入地了解Django查询的工作方式.
小智 42
Name.objects.filter(alias__gt='',alias__isnull=False)
Run Code Online (Sandbox Code Playgroud)
b3n*_*ng0 37
首先,Django文档强烈建议不要对基于字符串的字段(如CharField或TextField)使用NULL值.阅读文档以获得解释:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
解决方案:我认为你也可以在QuerySets上链接方法.试试这个:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Run Code Online (Sandbox Code Playgroud)
这应该给你你正在寻找的集合.
如果要排除 null ( None
)、空字符串 ( ""
) 以及包含空格 ( " "
) 的字符串,可以使用__regex
with with__isnull
过滤选项
Name.objects.filter(
alias__isnull = False,
alias__regex = r"\S+"
)
Run Code Online (Sandbox Code Playgroud)
alias__isnull=False
排除所有列空列
aliax__regex = r"\S+"
确保列值至少包含一个或多个非空白字符。
从Django 1.8开始,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Run Code Online (Sandbox Code Playgroud)
1. 使用 exclude 时,请记住以下几点以避免常见错误:
如果不添加多个条件成一个 exclude()
像块filter()
。要排除多个条件,您应该使用多个 exclude()
.
例子: (NOT a AND NOT b)
Entry.objects.exclude(title='').exclude(headline='')
Run Code Online (Sandbox Code Playgroud)
等于
SELECT... WHERE NOT title = '' AND NOT headline = ''
Run Code Online (Sandbox Code Playgroud)
================================================== ====
2. 只有在你真正了解它时才使用多个:
例子: NOT (a AND b)
Entry.objects.exclude(title='', headline='')
Run Code Online (Sandbox Code Playgroud)
等于
SELECT.. WHERE NOT (title = '' AND headline = '')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
325936 次 |
最近记录: |