django orm模糊查詢(xún)、正則匹配多個(gè)值方式
django orm模糊查詢(xún)、正則匹配多個(gè)值
需求
用戶(hù)列表以年齡段作為篩選條件過(guò)濾數(shù)據(jù),即篩選0-18歲的用戶(hù)、18-20歲的用戶(hù)…
easy, 這不分分鐘的事,可事情并沒(méi)有那么簡(jiǎn)單
表里并沒(méi)有用戶(hù)的年齡信息,也沒(méi)有出生日期信息,唯一相關(guān)的是身份證
class User(models.Model): name = models.CharField() id_number = models.CharField()
like模糊匹配
想到可以通過(guò) 查詢(xún)時(shí)的年份 - 篩選年齡 得到 出生年份的區(qū)間 ,sql中l(wèi)ike是可以精確匹配出生年份的:
select * from user where id_number like '______1996%';
轉(zhuǎn)換為模型類(lèi)篩選:
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
時(shí)并不需要加 %
,上邊那樣寫(xiě)是有問(wèn)題的。
后來(lái)查了文檔,發(fā)現(xiàn)做了轉(zhuǎn)義處理。
后來(lái)也并沒(méi)有查到如何實(shí)現(xiàn)like下劃線匹配位數(shù)
正則匹配
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) 正則里的{位數(shù)}和format用法有些沖突,不知道是不是有更好的寫(xiě)法
django ORM模糊查詢(xún) contains和Icontains區(qū)別
django filter中用contains和icontains區(qū)別
qs.filter(name__contains="e") qs.filter(name__icontains="e")
對(duì)應(yīng)sql
'contains': 'LIKE BINARY %s', 'icontains': 'LIKE %s',
其中的BINARY是 精確大小寫(xiě)
- 其中的BINARY是 精確大小寫(xiě)
- 而’icontains’中的’i’表示忽略大小寫(xiě)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析Python中的絕對(duì)導(dǎo)入與相對(duì)導(dǎo)入
這篇文章主要為大家詳細(xì)介紹了Python中的絕對(duì)導(dǎo)入與相對(duì)導(dǎo)入的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03Python可視化Tkinter進(jìn)階grid布局詳情
這篇文章主要介紹了Python可視化Tkinter進(jìn)階grid布局詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07解決Pycharm下面出現(xiàn)No R interpreter defined的問(wèn)題
今天小編就為大家分享一篇解決Pycharm下面出現(xiàn)No R interpreter defined的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Python+OpenAI?Whisper實(shí)現(xiàn)視頻生成字幕
這篇文章主要為大家詳細(xì)介紹了如何利用Python和OpenAI?Whisper實(shí)現(xiàn)視頻生成字幕功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-11-11使用Python實(shí)現(xiàn)一鍵往Word文檔的表格中填寫(xiě)數(shù)據(jù)
在工作中,我們經(jīng)常遇到將Excel表中的部分信息填寫(xiě)到Word文檔的對(duì)應(yīng)表格中,以生成報(bào)告,方便打印,所以本文小編就給大家介紹了如何使用Python實(shí)現(xiàn)一鍵往Word文檔的表格中填寫(xiě)數(shù)據(jù),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12