Mysql Django queryset选择concat所在的位置

Mysql Django queryset选择concat所在的位置,mysql,django,select,django-queryset,concat,Mysql,Django,Select,Django Queryset,Concat,我有这样一个sql查询: select * from sys_user_promotion_record where user_id=102 and concat(',' ,vendor_id, ',') like '%,1,%' 如何将该查询转换为django queryset? 到目前为止,我成功地制作了这个django queryset: SysUserPromotionRecord.objects.filter(user_id=102, vendor_id__contains=','+

我有这样一个sql查询:

select *
from sys_user_promotion_record
where user_id=102 and concat(',' ,vendor_id, ',') like '%,1,%'
如何将该查询转换为django queryset? 到目前为止,我成功地制作了这个django queryset:

SysUserPromotionRecord.objects.filter(user_id=102, vendor_id__contains=','+'1'+',')
如何将
concat(',',供应商id',')
转换为django queryset? 我避免在代码上使用原始sql查询。多谢各位

这是供应商id值示例:

  • 1,11,14

  • 2,1,5

  • 3,5,11


执行sql时,将显示第1行和第2行。

您所做的应该可以工作,但我假设供应商id是一个整数,因此没有任何逗号。如果这是真的,您的查询将始终返回一个空查询集

如果要在中查询供应商id(供应商id 1,供应商id 12,…),则查询为
。过滤器(供应商id=供应商id列表)

但是,如果您的供应商id确实是一个字符串,并且可以包含逗号,那么您的查询应该可以工作,但您也需要处理边缘情况,例如“…、11”、“11”和“11…”。因此,我建议这样做

from django.db.models import Q
vendor_query = Q(vendor_id__iregex=r'^{0},|,{0},|,{0}$|^{0}$'.format(vendor_id))
SysUserPromotionRecord.objects.filter(vendor_query, user_id=102)
编辑:看到您的更改,答案的第一部分似乎可以忽略


编辑:更新了正则表达式,因为前一个
r',?{},“
将返回错误的结果,例如在类型为“%”,1,“的mysql查询中搜索1时返回11这样的情况是数据库杀手

B树索引可用于以下表达式中的列比较:
使用=,>,>=,你到底为什么要这样做concat(“,”,vendor_id“,”)像“%”,1,“%”,“@e4c5这有点难以解释。这样做的目的是将1与11、12或13等区分开来。因此,我将3,5,11转换为3,5,11,因此当我查询供应商id(如“%”、1、%”)的位置时,供应商id 3,5,11将不会出现。那么,为什么不能只查询1呢?1和11是不同的,你知道:)@e4c5例如??你能给我一个更简单的问题吗?我的vendor\u id是一个字符串。你现在的问题实际上很适合“不清楚你在问什么”和“非MVCE”类型的闭包。你需要更好地解释你的问题。给你模型。例如,我不太理解这部分:
Q(vendor\u id\u iregex=r',?{},format(vendor\u id))
。我想从哪里获得
供应商id
对不起。
供应商id
在你的例子中是
11
,所以你的正则表达式可以是
r',11',
我把它作为一个变量,认为11只是一个例子,你可以有不同的值正则表达式基本上匹配0或1个逗号,后跟11,后跟0或者1 commai在django中尝试了这段代码,但它显示了与mysql查询控制台不同的行数。您的mysql查询只选择那些有11的行。它忽略了所有以11开头、以11结尾或只有11的行。例如3,5,11谢谢您的建议。我现在意识到这个数据库结构不好。我不是创建数据库的人。但是,稍后我会跟他商量,谢谢