django 在字符串[str(list)]中精確查找
1.問題描述
1.1表結構

1.2問題
ref_list為id列表的字符串,需要從ref_list中找出包含指定id的數據(eg id=8)。如果實用models.objects.filter(ref_list__contains=id)無法實現精確查找
models.objects.filter(ref_list__contains='8') ''' 結果: 1 | 8,9,10,11 2 | 18,81 3 | 23,8,33 4 | 36,78,8 5 | 37,98, 69 有多余的數據,增加了時間消耗 ''' models.objects.filter(ref_list__contains=',8') models.objects.filter(ref_list__contains='8,') models.objects.filter(ref_list__contains=',8,') ''' 無法精確查抄,并且還會使部分包含id=8的數據無法查找到 '''
用django 內置數據庫過濾API操作無法實現精確查找
2.extra()
函數原型:extra(params)
參數說明:由于沒有找到合適的資料,該部分暫時空缺。待找到在補充
1 Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) 2 等價于 3 SELECT * FROM blog_entry WHERE (foo='a' OR bar='a') AND (baz='a')
3.使用sql實現列表查找
3.1 FIND_IN_SET(str,strlist)
說明:如果字符串str在由N子串組成的表strlist之中,返回一個1到N的值。一個字符串表是被“,”分隔的子串組成的一個字符串。如果第一個參數是一個 常數字符串并且第二個參數是一種類型為SET的列,FIND_IN_SET()函數被優化而使用位運算!如果str不是在strlist里面或如果 strlist是空字符串,返回0。如果任何一個參數是NULL,返回NULL。如果第一個參數包含一個“,”,該函數將工作不正常。
SQL> SELECT FIND_IN_SET('b','a,b,c,d'); +---------------------------------------------------------+ | SELECT FIND_IN_SET('b','a,b,c,d') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec)
缺點:這個函數的問題是逗號中有空格無法識別,所以只能先用REPLACE把空格替換掉。
3.2 REPLACE(str,from_str,to_str)
說明:將str中所有的from_str替換為to_str,并返回處理后的結果
1 mysql> select REPLACE( 'www.mysql.com ', 'w', 'Ww'); 2 -> 'WwWwWw.mysql.com '
4 結果
models.objects.extra(where=[FIND_IN_SET( '8', REPLACE( ref_list, ' ', ''))]) ''' 1 | 8,9,10,11
3 | 23,8,33
4 | 36,78,8
精確查找
'''
5. 參考:
MySQL比like語句更高效的寫法locate position instr find_in_set
Mysql中查找逗號分隔的字符串數據
Django,數據模型創建之數據庫API參考
django中extra的用法
浙公網安備 33010602011771號