Как с помощью lookup’s отфильтровать данные?

В Django lookup - это способ фильтрации данных в запросах к базе данных с использованием специальных операторов. Они позволяют более гибко и точно определить условия фильтрации.

Django предоставляет множество встроенных lookup'ов для работы с различными типами полей и операций. Вот некоторые из них:

1. exact: это оператор по умолчанию и используется для точного сравнения значений поля. Например, Model.objects.filter(id__exact=1) вернет объекты модели, у которых значение поля id равно 1.

2. iexact: этот оператор выполняет регистронезависимое сравнение значений поля. Например, Model.objects.filter(name__iexact='john') вернет объекты модели, у которых значение поля name равно 'john' независимо от регистра.

3. contains: этот оператор выполняет поиск подстроки в значении поля. Например, Model.objects.filter(name__contains='doe') вернет объекты модели, у которых значение поля name содержит подстроку 'doe'.

4. icontains: это регистронезависимая версия оператора contains. Например, Model.objects.filter(name__icontains='john') вернет объекты модели, у которых значение поля name содержит подстроку 'john' независимо от регистра.

5. in: этот оператор выполняет проверку на вхождение значения поля в указанном списке. Например, Model.objects.filter(id__in=[1, 2, 3]) вернет объекты модели, у которых значение поля id равно 1, 2 или 3.

6. gt, gte, lt, lte: эти операторы выполняют сравнение полей с указанными значениями, использовать можно для числовых и дата-полей. Например, Model.objects.filter(age__gt=18) вернет объекты модели, у которых значение поля age больше 18.

7. startswith, istartswith, endswith, iendswith: эти операторы выполняют проверку на начало и конец строки. Например, Model.objects.filter(name__startswith='j') вернет объекты модели, у которых значение поля name начинается с буквы 'j'.

Это лишь некоторые из доступных lookup'ов в Django. Вы можете комбинировать их для создания более сложных условий фильтрации. Например, Model.objects.filter(name__icontains='john', age__gte=18) вернет объекты модели, у которых значение поля name содержит подстроку 'john' и значение поля age больше или равно 18.

Также в Django можно создавать собственные lookup'ы для пользовательских типов полей или определенных моделей. Это делается с помощью наследования от класса django.db.models.Lookup и создания метода as_sql для преобразования lookup'а в SQL-запрос.

В заключение можно сказать, что lookup'ы являются мощным инструментом для фильтрации данных в Django, позволяя нам точно определить требуемые условия фильтрации и выбрать только необходимые объекты.