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

我有first_name,last_name&别名(可选),我需要search。 所以,我需要一个查询来给我所有的名称有一个别名集。

只有我能做到:

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

那么,什么是上面的等效?

你可以这样做:

 Name.objects.exclude(alias__isnull=True) 

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

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

将这些方法链接在一起基本上独立地检查每个条件:在上面的例子中,我们排除了alias为null 空string的行,因此您可以获得所有具有非空,非空的alias字段的Name对象。 生成的SQL看起来像这样:

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

您还可以将多个parameter passing给一个要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对象 :

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

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

另外:我的SQL例子只是一个比喻 – 实际生成的SQL代码可能看起来不一样。 通过实际查看它们生成的SQL,您将对Django查询的工作方式有更深入的了解。

首先,Django文档强烈build议不要将基于string的字段(如CharField或TextField)使用NULL值。 阅读说明文档:

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

解决scheme:我想你也可以在QuerySets上链接方法。 尝试这个:

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

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

 Name.objects.filter(alias__gt='',alias__isnull=False) 

从Django 1.8开始,

 from django.db.models.functions import Length Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)