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

Django中如何用指定字符串匹配模型存储的正则表达式字段?

Django中反向正则匹配查询实现方法

当你需要用给定字符串(比如abc@example.com)匹配模型中存储的正则表达式字段时,Django ORM没有直接对应的查询后缀,得借助数据库原生函数来实现,以下是主流数据库的具体写法:

1. PostgreSQL数据库

利用PostgreSQL的~操作符(正则匹配),可以通过Exists结合原生SQL实现:

from django.db.models import Exists, OuterRef

email = 'abc@example.com'
# 找出所有pattern正则能匹配email的AudienceFilter记录
matches = AudienceFilter.objects.filter(
    Exists(
        AudienceFilter.objects.raw(
            "SELECT 1 FROM your_app_audiencefilter WHERE id = %s AND %s ~ pattern",
            [OuterRef('id'), email]
        )
    )
)

也可以自定义Func类来封装正则匹配逻辑:

from django.db.models import Func, Value, BooleanField

class RegexMatch(Func):
    function = 'REGEXP_MATCH'
    output_field = BooleanField()

matches = AudienceFilter.objects.annotate(
    matches_email=RegexMatch(Value(email), 'pattern')
).filter(matches_email__isnull=False)

2. MySQL/MariaDB数据库

使用MySQL的REGEXP操作符,通过extra方法执行原生查询条件:

email = 'abc@example.com'
matches = AudienceFilter.objects.extra(
    where=['%s REGEXP pattern'],
    params=[email]
)

或者自定义Func类简化调用:

from django.db.models import Func, Value, BooleanField

class RegexMatch(Func):
    function = 'REGEXP'
    output_field = BooleanField()

matches = AudienceFilter.objects.filter(
    RegexMatch(Value(email), 'pattern')
)

注意点

  • 不同数据库的正则语法有差异,要保证存储在pattern字段里的正则符合对应数据库的语法规范。
  • 以上写法都通过参数传递避免了SQL注入风险,不要直接拼接字符串到查询语句中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:11:27