Django ORM предоставляет мощный и гибкий инструментарий для взаимодействия с базой данных. Стандартные операции фильтрации, такие как равенство (exact или его сокращенная форма), сравнения (gt, lt, gte, lte), поиск по шаблону (contains, startswith, endswith, icontains и т.д.) широко известны и часто используются.
Обзор стандартных возможностей фильтрации Django
Основным методом для фильтрации в Django является .filter() QuerySet’а. Этот метод принимает в качестве аргументов ключевые слова, где имя ключевого слова — это имя поля модели (опционально с lookup-ом), а значение — это критерий для сравнения.
Примеры стандартной фильтрации:
from django.db.models import QuerySet
from .models import Product
def get_active_products() -> QuerySet[Product]:
"""Получает все активные продукты."""
return Product.objects.filter(is_active=True)
def get_products_above_price(price: float) -> QuerySet[Product]:
"""Получает продукты с ценой выше указанной."""
# 'price__gt' использует lookup 'gt' (greater than)
return Product.objects.filter(price__gt=price)
def find_products_by_name(name_part: str) -> QuerySet[Product]:
"""Ищет продукты, чье имя содержит подстроку (без учета регистра)."""
# 'name__icontains' использует lookup 'icontains'
return Product.objects.filter(name__icontains=name_part)Постановка задачи: необходимость фильтрации ‘не равно’
Несмотря на богатство стандартных lookup-ов, явного и интуитивно понятного оператора ‘не равно’ (вроде != в чистом Python) в виде стандартного lookup’а для метода .filter() нет. Часто возникает необходимость исключить определенные объекты или объекты с определенным значением поля из выборки. Например:
Получить всех пользователей, кроме администратора.
Выбрать все заказы, которые не находятся в статусе