筛选查询集中的空名称或空名称

我有我需要搜索的first_name,last_name&alias(可选)。 所以,我需要一个查询来为我提供所有具有别名集的名称。

只有我能做到:

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

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


你可以这样做:

Name.objects.exclude(alias__isnull=True)

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

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

将这些方法链接在一起基本上独立地检查每个条件:在上面的示例中,我们排除了alias为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的行被排除,所以我们得到两个字段都不为真的所有行。 生成的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=''))

有关更多信息,请参阅Django文档中的此页面和此页面。

顺便说一句:我的SQL例子只是一个比喻 - 实际生成的SQL代码可能看起来不一样。 通过实际查看它们生成的SQL,您将更深入地理解Django查询的工作方式。


首先,Django文档强烈建议不要将NULL值用于CharField或TextField等基于字符串的字段。 阅读说明文档:

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

解决方案:我认为,您也可以将QuerySets上的方法链接在一起。 尝试这个:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

这应该给你你正在寻找的设置。


Name.objects.filter(alias__gt='',alias__isnull=False)
链接地址: http://www.djcxy.com/p/38641.html

上一篇: Filtering for empty or NULL names in a queryset

下一篇: How to combine 2 or more querysets in a Django view?