如何在 Django 查询中使用正则表达式来获得最短匹配?

How to use regex in django query to get the shortest match?

我在 Postgres 数据库的一列中有一些条目,如下所示

Abcd/*
Abcd/dir1/*
Abcd/dir1/dir2/*
Abcd/dir1/dir2/dir3/*

我正在使用 django ORM 访问如下信息

given_path = "/some/path"
access_obj = Access.objects.get(dir_id=given_path) #dir_id is the column name

现在给定一条路径,我需要找到最早的匹配(允许*之后的任何路径,因此不要进一步搜索)并返回结果。

我的意思是说给定了一个路径 Abcd/dir1/dir2,因为我的第一个条目本身是 Abcd/* 所以我不需要再看下去 return 第一行对象本身。

目前我尝试使用 __icontains 如下所示进行检查

access_obj = Access.objects.get(dir_id__icontains=given_path)

但它会 return 所有匹配项,然后我无法弄清楚如何定位第一个匹配项(在本例中)并查询对象。

我知道 django 支持 regex 查询,但我不确定在此处应用什么。任何帮助将不胜感激。

用匹配路径的长度标注每个匹配结果,然后可以按这个长度排序,select first/shortest 结果

from django.db.models.functions import Length

access_obj = Access.objects.filter(
    dir_id__icontains=given_path
).annotate(
    l=Length('dir_id')
).order_by(
    'l'
).first()