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