Filtering for empty or NULL names in a queryset
我有first_name,last_name和别名(可选)我需要搜索。 所以,我需要一个查询来给我所有具有别名集的名称。
只有我能做到:
1 | Name.objects.filter(alias!="") |
那么,与上述相同的是什么?
你可以这样做:
1 | Name.objects.exclude(alias__isnull=True) |
如果您需要排除空值和空字符串,那么首选方法是将条件链接在一起,如下所示:
1 | Name.objects.exclude(alias__isnull=True).exclude(alias__exact='') |
将这些方法链接在一起基本上可以独立地检查每个条件:在上面的示例中,我们排除
1 | SELECT * FROM Name WHERE alias IS NOT NULL AND alias !="" |
您还可以将多个参数传递给对
1 | Name.objects.exclude(some_field=True, other_field=True) |
这里,
1 | SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE) |
或者,如果您的逻辑比这更复杂,您可以使用Django的Q对象:
1 2 | from django.db.models import Q Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact='')) |
有关详细信息,请参阅Django文档中的此页面和此页面。
暂且不说:我的SQL示例只是一个类比 - 实际生成的SQL代码可能看起来不同。通过实际查看它们生成的SQL,您将更深入地了解Django查询的工作方式。 sub>
1 | Name.objects.filter(alias__gt='',alias__isnull=False) |
首先,Django文档强烈建议不要对基于字符串的字段(如CharField或TextField)使用NULL值。阅读文档以获得解释:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
解:
我认为你也可以在QuerySets上链接方法。试试这个:
1 | Name.objects.exclude(alias__isnull=True).exclude(alias="") |
这应该给你你正在寻找的集合。
来自Django 1.8,
1 2 3 | from django.db.models.functions import Length Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0) |
为避免使用
您不能将多个条件添加到exclude()块(如
要排除多个条件,您必须使用多个exclude()
例
Incorrect:
User.objects.filter(email='[email protected]').exclude(profile__nick_name='',
profile__avt='')Correct:
User.objects.filter(email='[email protected]').exclude(profile__nick_name='').exclude(profile__avt='')
这是另一种简单的方法。
1 | Name.objects.exclude(alias=None) |
你可以这样做:
1 | Name.objects.exclude(alias="").exclude(alias=None) |
它就是那么简单。