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



我在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/*,所以我不需要进一步查看并返回第一行对象本身。

目前我尝试使用__icontains检查获取如下

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

但是它会返回所有的匹配,然后我无法弄清楚如何定位第一个匹配(在这种情况下)并查询对象。

我知道django在查询上支持regex,但我不确定在这里应用什么。如有任何帮助,不胜感激。

用匹配路径的长度标注每个匹配结果,然后您可以按此长度排序并选择第一个/最短的结果

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()

最新更新