django - 如何过滤 QuerySet 中的空名称或 NULL 名称?

标签 django django-models django-queryset filter null

我需要搜索first_namelast_namealias(可选)。因此,我需要一个查询来为我提供所有设置了别名的名称。

只有我能做到:

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

那么,上面的等价物是什么?

最佳答案

你可以这样做:

Name.objects.exclude(alias__isnull=True)

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

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

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

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

或者,如果您的逻辑比这更复杂,您可以使用 Django 的 Q objects :

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

有关详细信息,请参阅 this pagethis page在 Django 文档中。

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

关于django - 如何过滤 QuerySet 中的空名称或 NULL 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/844556/

相关文章:

python - 在python代码中访问在django中创建的表时出错

Django 查询是否可以使用 self

python - 进程的异步生成 : design question - Celery or Twisted

python - OneToThree django模型

django - 如何在 Django 中使用 UNION + 添加假列

django - Django 1.8 中的生产和开发数据库

Django 抛出 OperationalError : index row requires 35424 bytes, 最大大小为 8191

python - Django .latest() 值

Django 查询集 : using select_related to return objects from a set of foreign keys

django - 以 Django 形式缓存 ModelChoiceField 或 ModelMultipleChoiceField 的查询集选择