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, зная, что у вас есть по крайней мере все результаты, которые вы хотите, если не пара дополнительных.

Вернуться на верх