Django: Как реализовать «не равно» в фильтре моделей?

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() нет. Часто возникает необходимость исключить определенные объекты или объекты с определенным значением поля из выборки. Например:

Получить всех пользователей, кроме администратора.

Выбрать все заказы, которые не находятся в статусе


Добавить комментарий