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的用法

时间: 2024-10-08 00:31:23

django 在字符串[str(list)]中精确查找的相关文章

编写一个函数char_contains(char str[],char c), 如果字符串str中包含字符c则返回数值1,否则返回数值0

/* 编写一个函数char_contains(char str[],char c), 如果字符串str中包含字符c则返回数值1,否则返回数值0 */ #include <string.h> #include <stdio.h> // 可读性 -> 性能 -> 精简(重构) int char_contains(char str[], char c); int main() { //int result = char_contains("itc8ast"

在linux系统中,如何使用【find】命令精确查找文件?

[find]是文件查找工具,它会遍历指定目录下所有文件的,所以使用该命令,查找文件的速度比较慢.但是它能够文件类根据型.文件的各做为条查件,找显示符合条件的文件目录. 一.既然,[find]是根据文件的特点来查看文种属性件的.那么先了解,文件有啥特点. 1.文件特点有很多,它们是分类的.find 命令如何表示文件特点的类别的: [find]命令是如何标识文件特点的类别的:              文件名称                   -name              文件类型   

js----去掉字符串str中,连续重复的地方 的2中方法

在学习百度前端学院js课程的时候碰到这样一个练习  "去掉字符串str中,连续重复的地方", 我自己做法是:将字符串变为数组A,创建一个空数组B,对数组A进行循环,再在循环里面拿A的数组元素一个一个和B的最后一个数组元素比,不一致的元素放进数组B中 然后再将数组B用字符串的形式表现出来,自己的代码如下: 1 function removeRepetition(str) { 2 var result = "", //空的结果 3 strA =str.split(&qu

Mysql 模糊匹配(字符串str中是否包含子字符串substr)

1.LIKE 通常与 % 一同使用,类似于一个元字符的搜索.若substr不在str中,则返回0. SELECT 'test' LIKE '%e%' as `ret`; # 1 SELECT 'test' LIKE '%a%' as `ret`; # 0 2.INSTR(str,substr) 返回字符串 str 中子字符串的第一次出现位置.若substr不在str中,则返回0. SELECT INSTR('test', 't'); # 1 SELECT INSTR('test', 'a');

C++string中用于查找的find系列函数浅析

总述:      以下所讲的所有的string查找函数,都有唯一的返回类型,那就是size_type,即一个无符号整数(按打印出来的算).若查找成功,返回按查找规则找到的第一个字符或子串的位置:若查找失败,返回npos,即-1(打印出来为4294967295). 1.fine() 原型: //string (1) size_type find (const basic_string& str, size_type pos = 0) const noexcept; //c-string (2) s

linux shell 字符串操作(长度,查找,替换,匹配)详解

linux shell 字符串操作(长度,查找,替换,匹配)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${va

Python中如何查找和替换文本?

在Python开发中查找和替换非常简单,如果当前对象是一个字符串 str 时,你可以使用该类型提供的 find() 或者 index() 方法查找指定的字符,如果能找到则会返回字符第一次出现的索引,如果不存在则返回-1. >>> s = 'Cat and Dog'>>> s.find('Dog')8>>> s.index('Dog')8>>> s.find('Duck') -1 如果要替换目标字符串,用 replace() 方法就好了

PHP:字符串转数组,数组转字符串;字符串截取、替换、查找

字符串转数组$str = 'one|two|three|four'; print_r(explode('|', $str)); //explode 以字符串分割字符串到数组 $str = 'one two three'; //str_split 以位数分割 $arr1 = str_split($str); $arr2 = str_split($str, 3); print_r($arr1); print_r($arr2); 打印如下:Array ( [0] => o [1] => n [2]

字符串匹配算法一:查找子字符串

[题目] 就是给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str里包含{a,b,c}的最短子串.要求O(n). [例子] 字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc. [分析] 有题意可知,满足要求的字符串只需要包括字符集中的所有字符,并没有顺序要求 当然最容易想到的是做一个字符匹配的过程,但题目要求查找次数为O(n),在思考了几种解决方法后,觉得下面的方案能够达到要求,虽然需要一些额外的空间. 下面我给出自己的解决方案,难免有遗漏的地方,如果路过的朋