我有first_name
,last_name
和;alias
(可选),我需要搜索.所以,我需要一个查询来提供所有别名集的名称.
如果我能做到的话:
Name.objects.filter(alias!="")
那么,上述的类似功能是什么呢?
我有first_name
,last_name
和;alias
(可选),我需要搜索.所以,我需要一个查询来提供所有别名集的名称.
如果我能做到的话:
Name.objects.filter(alias!="")
那么,上述的类似功能是什么呢?
您可以这样做:
Name.objects.exclude(alias__isnull=True)
如果需要排除空值and个空字符串,首选的方法是将条件链接在一起,如下所示:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
将这些方法链接在一起基本上会独立地判断每个条件:在上面的示例中,我们排除了alias
为null或or为空字符串的行,因此得到了所有Name
个对象,这些对象都有一个not null、not empty alias
字段.生成的SQL看起来像:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
您还可以将多个参数传递给对exclude
的单个调用,这将确保仅排除符合every条件的对象:
Name.objects.exclude(some_field=True, other_field=True)
这里,排除了some_field
、and、other_field
为TRUE的行,因此我们获得了两个字段都不为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文档中的this page和this page.
顺便说一句:我的SQL示例只是一个类比--实际生成的SQL代码可能看起来不同.通过实际查看Django查询生成的SQL,您将更深入地了解Django查询是如何工作的.