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

 更新时间:2023年08月12日 15:36:08   作者:_ blank  
这篇文章主要介绍了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下划线匹配位数

image-20210414145541928

正则匹配

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 字典套字典或列表的示例

    python 字典套字典或列表的示例

    今天小编就为大家分享一篇python 字典套字典或列表的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 浅析Python中的绝对导入与相对导入

    浅析Python中的绝对导入与相对导入

    这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • 一文带你了解Python中的延迟绑定

    一文带你了解Python中的延迟绑定

    Python中的延迟绑定是指在嵌套函数中,内部函数在被调用时才会绑定外部函数的变量,而不是在定义内部函数时就绑定。本文将通过一些例子带大家深入了解Python中的延迟绑定,感兴趣的可以了解一下
    2023-05-05
  • Python可视化Tkinter进阶grid布局详情

    Python可视化Tkinter进阶grid布局详情

    这篇文章主要介绍了Python可视化Tkinter进阶grid布局详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Python如何使用paramiko模块连接linux

    Python如何使用paramiko模块连接linux

    这篇文章主要介绍了Python如何使用paramiko模块连接linux,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解决Pycharm下面出现No R interpreter defined的问题

    解决Pycharm下面出现No R interpreter defined的问题

    今天小编就为大家分享一篇解决Pycharm下面出现No R interpreter defined的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python 如何在测试中使用 Mock

    python 如何在测试中使用 Mock

    这篇文章主要介绍了python 如何在测试中使用 Mock,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Django中间件整合Vue拦截器的使用

    Django中间件整合Vue拦截器的使用

    本文主要介绍了Django中间件整合Vue拦截器的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python+OpenAI Whisper实现视频生成字幕

    Python+OpenAI Whisper实现视频生成字幕

    这篇文章主要为大家详细介绍了如何利用Python和OpenAI Whisper实现视频生成字幕功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-11-11
  • 使用Python实现一键往Word文档的表格中填写数据

    使用Python实现一键往Word文档的表格中填写数据

    在工作中,我们经常遇到将Excel表中的部分信息填写到Word文档的对应表格中,以生成报告,方便打印,所以本文小编就给大家介绍了如何使用Python实现一键往Word文档的表格中填写数据,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-12-12

最新评论