我有first_name, last_name和别名(可选),我需要搜索。因此,我需要一个查询来给我所有有别名集的名称。
只要我能做到:
Name.objects.filter(alias!="")
那么,与上面的等价的是什么呢?
我有first_name, last_name和别名(可选),我需要搜索。因此,我需要一个查询来给我所有有别名集的名称。
只要我能做到:
Name.objects.filter(alias!="")
那么,与上面的等价的是什么呢?
当前回答
另一种方法是使用泛型的isempty查找,它可以用于任何字段。
它也可以被django rest_framework或其他使用django查找的应用程序使用:
from distutils.util import strtobool
from django.db.models import Field
from django.db.models.lookups import BuiltinLookup
@Field.register_lookup
class IsEmpty(BuiltinLookup):
lookup_name = 'isempty'
prepare_rhs = False
def as_sql(self, compiler, connection):
sql, params = compiler.compile(self.lhs)
condition = self.rhs if isinstance(self.rhs, bool) else bool(strtobool(self.rhs))
if condition:
return "%s IS NULL or %s = ''" % (sql, sql), params
else:
return "%s <> ''" % sql, params
然后你可以这样使用它:
Name.objects.filter(alias__isempty=False)
其他回答
Name.objects.filter(alias__gt='',alias__isnull=False)
1. 在使用exclude时,请记住以下内容,以避免常见错误:
不应该像filter()那样在exclude()块中添加多个条件。要排除多个条件,应该使用multiple exclude()。
例子:(不是a也不是b)
Entry.objects.exclude(title='').exclude(headline='')
等于
SELECT... WHERE NOT title = '' AND NOT headline = ''
======================================================
2. 只有在你真正了解它的时候才使用multiple:
示例:NOT (a AND b)
Entry.objects.exclude(title='', headline='')
等于
SELECT.. WHERE NOT (title = '' AND headline = '')
另一种方法是使用泛型的isempty查找,它可以用于任何字段。
它也可以被django rest_framework或其他使用django查找的应用程序使用:
from distutils.util import strtobool
from django.db.models import Field
from django.db.models.lookups import BuiltinLookup
@Field.register_lookup
class IsEmpty(BuiltinLookup):
lookup_name = 'isempty'
prepare_rhs = False
def as_sql(self, compiler, connection):
sql, params = compiler.compile(self.lhs)
condition = self.rhs if isinstance(self.rhs, bool) else bool(strtobool(self.rhs))
if condition:
return "%s IS NULL or %s = ''" % (sql, sql), params
else:
return "%s <> ''" % sql, params
然后你可以这样使用它:
Name.objects.filter(alias__isempty=False)
从Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
首先,Django文档强烈建议不要为基于字符串的字段(如CharField或TextField)使用NULL值。阅读文档了解解释:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
解决方案: 你也可以把QuerySets上的方法链接在一起。试试这个:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
这样就能达到你想要的效果了。