我有first_name,last_name和alias(可选)我需要搜索 . 所以,我需要一个查询来给我所有具有别名集的名称 .
只有我能做到:
Name.objects.filter(alias!="")
那么,与上述相同的是什么?
来自Django 1.8,
from django.db.models.functions import Length Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Name.objects.filter(alias__gt='',alias__isnull=False)
你可以这样做:
Name.objects.exclude(alias="")
答案似乎在这周围跳舞,但它真的就是那么简单 . filter 用于匹配, exclude 用于匹配除指定内容之外的所有内容 .
filter
exclude
这是另一种简单的方法 .
Name.objects.exclude(alias=None)
首先,Django文档强烈建议不要对基于字符串的字段(如CharField或TextField)使用NULL值 . 阅读文档以获得解释:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
解决方案:我认为你也可以在QuerySets上链接方法 . 试试这个:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
这应该给你你正在寻找的集合 .
Name.objects.exclude(alias__isnull=True)
如果您需要排除空值和空字符串,那么首选方法是将条件链接在一起,如下所示:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
将这些方法链接在一起基本上独立地检查每个条件:在上面的示例中,我们排除 alias 为null或空字符串的行,因此您将获得具有非空,非空 alias 字段的所有 Name 对象 . 生成的SQL看起来像:
alias
Name
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
您还可以将多个参数传递给 exclude 的单个调用,这将确保只排除满足每个条件的对象:
Name.objects.exclude(some_field=True, other_field=True)
这里, some_field 和 other_field 为真的行被排除,因此我们得到两个字段都不为真的所有行 . 生成的SQL代码看起来有点像这样:
some_field
other_field
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代码可能看起来不同 . 通过实际查看它们生成的SQL,您将更深入地了解Django查询的工作方式 .
6 回答
来自Django 1.8,
你可以这样做:
答案似乎在这周围跳舞,但它真的就是那么简单 .
filter
用于匹配,exclude
用于匹配除指定内容之外的所有内容 .这是另一种简单的方法 .
首先,Django文档强烈建议不要对基于字符串的字段(如CharField或TextField)使用NULL值 . 阅读文档以获得解释:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
解决方案:我认为你也可以在QuerySets上链接方法 . 试试这个:
这应该给你你正在寻找的集合 .
你可以这样做:
如果您需要排除空值和空字符串,那么首选方法是将条件链接在一起,如下所示:
将这些方法链接在一起基本上独立地检查每个条件:在上面的示例中,我们排除
alias
为null或空字符串的行,因此您将获得具有非空,非空alias
字段的所有Name
对象 . 生成的SQL看起来像:您还可以将多个参数传递给
exclude
的单个调用,这将确保只排除满足每个条件的对象:这里,
some_field
和other_field
为真的行被排除,因此我们得到两个字段都不为真的所有行 . 生成的SQL代码看起来有点像这样:或者,如果您的逻辑比这更复杂,您可以使用Django的Q objects:
有关更多信息,请参阅Django文档中的this page和this page .
暂且不说:我的SQL示例只是一个类比 - 实际生成的SQL代码可能看起来不同 . 通过实际查看它们生成的SQL,您将更深入地了解Django查询的工作方式 .