如何过滤空或空名称在一个QuerySet?

我有first_namelast_name &alias(可选),我需要搜索。因此,我需要一个查询来给我所有有别名集的名称。

只要我能做到:

Name.objects.filter(alias!="")

那么,与上面的等价的是什么呢?

463415 次浏览

你可以这样做:

Name.objects.exclude(alias__isnull=True)

如果你需要排除空值而且空字符串,首选的方法是将条件链接在一起,如下所示:

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

将这些方法链接在一起基本上是独立地检查每个条件:在上面的例子中,我们排除了alias为空为空字符串的行,因此您得到了所有具有非空、非空alias字段的Name对象。生成的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为真的行被排除在外,因此我们得到两个字段都不为真的所有行。生成的SQL代码看起来有点像这样:

SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)

或者,如果你的逻辑比这更复杂,你可以使用Django的问对象:

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

更多信息请参阅Django文档中的这个页面这个页面

顺便说一句:我的SQL示例只是一个类比——实际生成的SQL代码可能看起来不一样。通过实际查看Django查询生成的SQL,您将更深入地了解Django查询是如何工作的。

首先,Django文档强烈建议不要为基于字符串的字段(如CharField或TextField)使用NULL值。阅读文档了解解释:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

< p >解决方案: 你也可以把QuerySets上的方法链接在一起。试试这个:< / p >
Name.objects.exclude(alias__isnull=True).exclude(alias="")

这样就能达到你想要的效果了。

Name.objects.filter(alias__gt='',alias__isnull=False)

从Django 1.8,

from django.db.models.functions import Length


Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)

你可以简单地这样做:

Name.objects.exclude(alias="").exclude(alias=None)

其实就是这么简单。filter用于匹配,exclude用于匹配除指定内容以外的所有内容。这将在SQL中计算为NOT alias='' AND alias IS NOT NULL

这是另一种简单的方法。

Name.objects.exclude(alias=None)

1. 在使用exclude时,请记住以下内容,以避免常见错误:

应该像filter()一样将多个条件添加到一个 exclude()块中。要排除多个条件,您应该使用多个 exclude()

例如:# EYZ0

Entry.objects.exclude(title='').exclude(headline='')

等于

SELECT... WHERE NOT title = '' AND NOT headline = ''

======================================================

2. 只有在你真正了解它的时候才使用multiple:

例如:# EYZ0

Entry.objects.exclude(title='', headline='')

等于

SELECT.. WHERE NOT (title = '' AND headline = '')

另一种方法是使用通用的isempty查找,它可以用于任何字段。

它也可以被django rest_framework或其他使用django查找的应用程序使用:

from distutils.util import strtobool
from django.db.models import Field
from django.db.models.lookups import BuiltinLookup


@Field.register_lookup
class IsEmpty(BuiltinLookup):
lookup_name = 'isempty'
prepare_rhs = False


def as_sql(self, compiler, connection):
sql, params = compiler.compile(self.lhs)
condition = self.rhs if isinstance(self.rhs, bool) else bool(strtobool(self.rhs))
if condition:
return "%s IS NULL or %s = ''" % (sql, sql), params
else:
return "%s <> ''" % sql, params

然后你可以这样使用它:

Name.objects.filter(alias__isempty=False)

如果你想排除null (None),空字符串(""),以及包含空格的字符串(" "),你可以使用__regex__isnull过滤器选项

Name.objects.filter(
alias__isnull = False,
alias__regex = r"\S+"
)

alias__isnull=False排除所有空列

aliax__regex = r"\S+"确保列值至少包含一个或多个非空格字符。