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