Django模型查询返回逗号分隔值列表如何拆分为独立元素
问题原因
你当前代码有两个核心问题:
Create_Watchlist.objects.get(id=pk)这行查询没有将返回结果赋值给变量,属于无效代码,完全没有作用。- 后续用
Create_Watchlist.objects.all()会拉取全表所有自选股记录,和传入的pk参数没有关联,不符合单条自选详情的查询逻辑。
另外你现在ticker字段存的是逗号拼接的字符串,比如单条记录存了AAPL, BTC,用values_list取出来自然是把整串作为一个列表元素,不会自动拆分。
可直接运行的修复代码
def watchlist_one(request, pk): # 取指定id对应的自选股记录 watchlist_item = Create_Watchlist.objects.get(id=pk) # 按逗号拆分ticker字符串,自动去除每个代码前后的空格,过滤空值 # 单代码(如"FB")、多代码(如"AAPL, BTC")场景都兼容 list_ticker = [ticker.strip() for ticker in watchlist_item.ticker.split(',') if ticker.strip()] # 后续直接遍历list_ticker发起单个标的的API请求即可
代码逻辑说明:
- 当
ticker值为FB时,split(',')返回['FB'],处理后结果为['FB'] - 当
ticker值为AAPL, BTC时,split(',')返回['AAPL', ' BTC'],经strip()去除空格后结果为['AAPL', 'BTC'] - 自动过滤拆分后产生的空字符串,避免输入时多打逗号产生无效请求
Django QuerySet 相关知识点补充
objects.get():查询匹配条件的单条记录,返回模型实例,如果匹配不到或者匹配到多条会直接抛异常,适合用主键id这类唯一条件查询。objects.all():返回全表所有记录的QuerySet,不会做任何过滤,没有特殊需求不要在业务逻辑里直接用,很容易查到无关数据。values_list('字段名', flat=True):返回指定字段值组成的列表,如果字段存的是字符串,不会自动做字符串拆分,拿到的就是数据库里存的原始值。- 数据设计优化建议:如果每个ticker对应独立的交易标的,不建议把多个代码用逗号拼接存在一个CharField里,后续做筛选、统计都会非常麻烦。条件允许的话可以改成关联表结构,或者用支持数组的字段类型存储,省去手动拆分字符串的步骤。
内容的提问来源于stack exchange,提问作者micho
相关产品推荐
相关产品推荐

