django orm模糊查询、正则匹配多个值方式
django orm模糊查询、正则匹配多个值
需求
用户列表以年龄段作为筛选条件过滤数据,即筛选0-18岁的用户、18-20岁的用户…
easy, 这不分分钟的事,可事情并没有那么简单
表里并没有用户的年龄信息,也没有出生日期信息,唯一相关的是身份证
class User(models.Model): name = models.CharField() id_number = models.CharField()
like模糊匹配
想到可以通过 查询时的年份 - 筛选年龄 得到 出生年份的区间 ,sql中like是可以精确匹配出生年份的:
select * from user where id_number like '______1996%';
转换为模型类筛选:
def get(self, request): age_list = self.get_birth_year(0, 18) query = reduce(operator.or_, (Q(id_number__contains=x) for x in age_list)) users = User.objects.filter(query) def get_birth_year(self, age_start, age_end): now_year = datetime.datetime.now().year start_year = now_year - age_end end_year = now_year - age_start return [r'______{}%'.format(i) for i in range(start_year, end_year)]
But 平常使用 contains
时并不需要加 %
,上边那样写是有问题的。
后来查了文档,发现做了转义处理。
后来也并没有查到如何实现like下划线匹配位数
正则匹配
def get(self, request): age_list = self.get_birth_year(0, 18) query = reduce(operator.or_, (Q(id_number__regex=x) for x in age_list)) users = User.objects.filter(query) def get_birth_year(self, age_start, age_end): now_year = datetime.datetime.now().year start_year = now_year - age_end end_year = now_year - age_start return [r'^[0-9]{0}{1}[0-9xX]+$'.format('{6}', i) for i in range(start_year, end_year)] # '^[0-9]{0}{1}[0-9xX]+$'.format('{6}', i) 正则里的{位数}和format用法有些冲突,不知道是不是有更好的写法
django ORM模糊查询 contains和Icontains区别
django filter中用contains和icontains区别
qs.filter(name__contains="e") qs.filter(name__icontains="e")
对应sql
'contains': 'LIKE BINARY %s', 'icontains': 'LIKE %s',
其中的BINARY是 精确大小写
- 其中的BINARY是 精确大小写
- 而’icontains’中的’i’表示忽略大小写
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Python协程异步爬取数据(asyncio+aiohttp)实例
这篇文章主要为大家介绍了Python协程异步爬取数据(asyncio+aiohttp)实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08python采用requests库模拟登录和抓取数据的简单示例
这篇文章主要介绍了python采用requests库模拟登录和抓取数据的简单示例,代码简单却功能强大!需要的朋友可以参考下2014-07-07
最新评论