Django - Фильтрация строки между двумя значениями
У меня есть такая модель:
class Model(...):
code = models.CharField(...)
Моя таблица моделей заполнена следующим образом:
ID | CODE
-----|------------
1 | c-AB-xyz
2 | c-AC-edf
3 | c-BB-mng
4 | c-BC-lmp
5 | c-CB-qrs
6 | c-CC-tuv
Я хочу отфильтровать экземпляры на основе того, с чего начинается их строка code
. Я также хочу указать начало и конец.
Например, как я могу отфильтровать экземпляры, которые имеют начальное значение code
между c-BB
и c-CB
?
Что-то вроде:
Model.objects.filter(
code__startswith__between = ['c-BB', 'c-CB']
)
Что должно вернуть экземпляры 3, 4 и 5.
Сначала, пожалуйста, попробуйте с:
objs = Model.objects.filter(code__startswith__range=(rangeStart, rangeStop))
Если это не работает так, как ожидалось, используйте следующую функцию для отсеивания элементов модели:
def string_range_filter(objs, range_start="c-BB", range_stop="c-CB"):
match = []
# find minimum length of range_start and range_stop
min_len = min(len(range_start), len(range_stop))
for item in objs:
chars_to_compare = item.code[:min_len]
if range_start[:min_len] <= chars_to_compare <= range_stop[:min_len]:
match.append(item)
return match
objects = Model.objects.all()
matches = string_range_filter(objs=objects)
Это проще всего сделать с помощью regex:
Model.objects.filter(
code__regex=r'^c-[BC]B.*$'
)
Это не совсем то, о чем вы спрашиваете, но имеет преимущество в том, что делегирует работу движку базы данных. Затем вы можете отфильтровать полученный QuerySet, зная, что у вас есть по крайней мере все результаты, которые вы хотите, если не пара дополнительных.