Как использовать regex в запросе 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()