一尘不染

在查询集中过滤空或NULL名称

django

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

仅在我可以做的情况下:

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

那么,什么等同于以上内容?


阅读 549

收藏
2020-03-27

共1个答案

一尘不染

你可以这样做:

Name.objects.exclude(alias__isnull=True)

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

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

将这些方法链接在一起基本上可以独立地检查每个条件:在上面的示例中,我们排除了其中aliasnull 或空字符串的行,因此你将获得所有Name具有非空非空alias字段的对象。生成的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的行,因此我们得到两个字段都不为真的所有行。生成的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=''))
2020-03-27