背景
之前我遇到一个需求,需要根据用户输入的条件去查询比如用户输入name: s*,就查询name以s开头的对象,当然我们可以用django中自带的一些查询操作去实现,比如contains、startswith等等,也可以用把*转成%,然后利用raw方法带入原生sql查询,但是感觉都比较繁琐,下面我们自定义一个查询器去实现它。
本实例使用Django3.2.8
自定义查询器
mysql中模糊查询是用like去判断%标识查询的,我们就自定义一个like,代码很简单
代码如下:
from django.db.models import Lookup
class LikeSearch(Lookup):
lookup_name = 'like'
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 + rhs_params
return '%s like %s' % (lhs, rhs), params
这样就实现了一个查询器,当然还没完,还需要注册它才能使用
from django.db.models.fields import Field
Field.register_lookup(LikeSearch)
或者使用装饰器注册
@Field.register_lookup
class LikeSearch(Lookup):
pass
这样就可以使用它了
Model.objects.filter(name__like='%s%')