django orm模糊查询、正则匹配多个值

1. 需求

用户列表以年龄段作为筛选条件过滤数据,即筛选0-18岁的用户、18-20岁的用户…

easy, 这不分分钟的事,可事情并没有那么简单

表里并没有用户的年龄信息,也没有出生日期信息,唯一相关的是身份证

class User(models.Model):
  name = models.CharField()
  id_number = models.CharField()
2. 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下划线匹配位数

image-20210414145541928

3. 正则匹配
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用法有些冲突,不知道是不是有更好的写法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值