You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django ORM结合MySQL REGEXP筛选无嵌套路径的FileField记录

问题分析

你原来的正则存在两个核心问题:

  1. 单字符匹配规则[0-9a-zA-Z\-]只能匹配1个字符,无法覆盖长度不定的文件名
  2. 没有限制media/后不能出现斜杠,无法排除嵌套路径的记录

正确实现

符合MySQL REGEXP规则的查询语句如下:

MyModel.objects.filter(media__iregex=r"^media/[^/]+\.[^/]+$")

正则规则说明:

  • ^media/:固定匹配字符串开头的media/前缀
  • [^/]+:匹配至少1个非斜杠的任意字符,确保media/后不会出现第二个斜杠,直接排除所有带嵌套路径的记录
  • \.:匹配文件名和后缀之间的 . 符号(需要转义避免被识别为正则通配符)
  • [^/]+$:匹配至少1个非斜杠的后缀字符,直到字符串结束,避免后缀后出现多余路径字符

可选调整

如果需要兼容没有后缀的文件名(比如media/README),可以简化正则为:

MyModel.objects.filter(media__iregex=r"^media/[^/]+$")

性能提示

由于REGEXP查询无法利用media字段的数据库索引,百万级数据下查询速度会比较慢。如果这个筛选逻辑是高频使用的,建议新增一个is_root_media布尔类型字段,写入数据时直接标记是否为根目录文件,后续查询直接过滤该字段即可大幅提升性能。


内容的提问来源于stack exchange,提问作者uedemir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:06:03