如何在没有 RawSQL 的情况下在 Django 中创建和访问正则表达式捕获组?

2024-05-01

如何在不使用 RawSQL 的情况下使用 Regex 捕获组注释 Django 查询集,以便稍后可以使用该值进行过滤和排序?

例如,在 PostgreSQL 中我可以进行以下查询:

CREATE TABLE foo (id varchar(100));

INSERT INTO foo (id) VALUES ('disk1'), ('disk10'), ('disk2');

SELECT
    "foo"."id",
    CAST((regexp_matches("foo"."id", '^(.*\D)([0-9]*)$'))[2] AS integer) as grp2
FROM "foo"
ORDER BY "grp2"

从 Django 1.8 开始,您可以使用Func()表达式 https://docs.djangoproject.com/en/2.1/ref/models/expressions/#func-expressions.

from django.db.models import Func

class EndNumeric(Func):
    function = 'REGEXP_MATCHES'
    template = "(%(function)s(%(expressions)s, '^(.*\D)([0-9]*)$'))[2]::integer"

qs = Foo.objects.annotate(
    grp2=EndNumeric('id'),
).values('id', 'grp2').order_by('grp2')

参考:在django中使用正则表达式按指定字段排序查询集 https://stackoverflow.com/a/50645573/8601760

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有 RawSQL 的情况下在 Django 中创建和访问正则表达式捕获组? 的相关文章

随机推荐