自定义查找不完整



我正在尝试自定义isull查找,以返回null值和空白值,而django纪录片没有提供足够的信息来说明它是如何工作的。我需要一些帮助来编写params和返回值。

这是我到目前为止的代码:

from django.db.models import Lookup

class IsNull(Lookup):
lookup_name = 'isnull'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + lhs_params
if rhs_params[0]:
return '%s != %s and %s != %s' % (lhs, None, lhs, str()), params
else:
return '%s == %s or %s == %s' % (lhs, None, lhs, str()), params
# User.objects.filter(first_name__is_null=True)

错误:

return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: near "LIMIT": syntax error

答案在内置的isull查找中。

自定义:

import warnings
from django.db.models import Field
from django.db.models.lookups import BuiltinLookup
from django.utils.deprecation import RemovedInDjango40Warning

@Field.register_lookup
class IsNull(BuiltinLookup):
lookup_name = 'isnull'
prepare_rhs = False
def as_sql(self, compiler, connection):
if not isinstance(self.rhs, bool):
# When the deprecation ends, replace with:
# raise ValueError(
#     'The QuerySet value for an isnull lookup must be True or '
#     'False.'
# )
warnings.warn(
'Using a non-boolean value for an isnull lookup is '
'deprecated, use True or False instead.',
RemovedInDjango40Warning,
)
sql, params = compiler.compile(self.lhs)
if self.rhs:
# * return either null or blank
return "%s IS NULL OR %s IS ''" % (sql, sql), params
else:
# * return neither null nor blank
return "%s IS NOT NULL AND %s IS NOT ''" % (sql, sql), params

原件:

@Field.register_lookup
class IsNull(BuiltinLookup):
lookup_name = 'isnull'
prepare_rhs = False
def as_sql(self, compiler, connection):
if not isinstance(self.rhs, bool):
# When the deprecation ends, replace with:
# raise ValueError(
#     'The QuerySet value for an isnull lookup must be True or '
#     'False.'
# )
warnings.warn(
'Using a non-boolean value for an isnull lookup is '
'deprecated, use True or False instead.',
RemovedInDjango40Warning,
)
sql, params = compiler.compile(self.lhs)
if self.rhs:
return "%s IS NULL" % sql, params
else:
return "%s IS NOT NULL" % sql, params

最新更新