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

12 浏览
0 Comments

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

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

只有我能做:

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

那么,相应的等价物是什么?

admin 更改状态以发布 2023年5月23日
0
0 Comments
Name.objects.filter(alias__gt='',alias__isnull=False)

(这是一段HTML代码,表示显示一个文字“123”,其中“123”被加粗了)

0
0 Comments

你可以这样做:

Name.objects.exclude(alias__isnull=True)

如果你需要排除空值和空字符串,最好的方法是将条件链接在一起,像这样:

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

这些方法链基本上独立地检查每个条件:在上面的例子中,我们排除alias为null或空字符串的行,因此你会得到所有具有非null、非空alias字段的Name对象。生成的SQL代码可能是这样的:

SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""

你也可以在一个exclude调用中传递多个参数,这将确保只有符合每个条件的对象被排除:

Name.objects.exclude(some_field=True, other_field=True)

在这里,被排除的是some_fieldother_field都为true的行,因此我们得到了所有some_fieldother_field都不为true的行。生成的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=''))

更多信息请参见Django文档中的这一页这一页

另外,我的SQL示例只是类比--实际生成的SQL代码可能看起来不同。通过实际查看它们生成的SQL,你将更深入地了解Django查询的工作原理。

0