如何用Django ORM结合MySQL REGEXP筛选无嵌套路径的FileField记录
问题分析
你原来的正则存在两个核心问题:
- 单字符匹配规则
[0-9a-zA-Z\-]只能匹配1个字符,无法覆盖长度不定的文件名 - 没有限制
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
相关产品推荐
相关产品推荐

