РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
160 of 818 menu

Класс Greatest

Класс Greatest применяется в выражениях Django ORM для получения максимального значения среди переданных полей, констант или других выражений. Он вычисляется непосредственно в базе данных, что позволяет выполнять сложные сравнения без загрузки данных в Python. Класс принимает два или более выражений и возвращает наибольшее из них. Если одно из выражений содержит NULL, результат также будет NULL. Для работы с NULL рекомендуется использовать Coalesce.

Класс часто используется для сравнения значений нескольких полей модели или для вычисления максимума между полем и константой. Он может применяться в методах annotate, aggregate, а также в фильтрации с filter.

Синтаксис

from django.db.models import Greatest Greatest(expression1, expression2, ..., output_field=None)

Параметры:

  • expression1, expression2, ... - выражения для сравнения (поля модели, числа, строки или другие выражения)
  • output_field - опциональный параметр, задающий тип данных результата (например, IntegerField)

Пример

Допустим, у нас есть модель Product с полями price и discount_price. Найдем для каждого товара максимальную цену (без учета скидки или со скидкой):

from django.db import models from django.db.models import Greatest class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) discount_price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) # Аннотируем каждый товар максимальной ценой products = Product.objects.annotate( max_price=Greatest('price', 'discount_price') ) for product in products: print(f"{product.name}: {product.max_price}")

Результат выполнения кода:

"Laptop: 1500.00" "Smartphone: 800.00" "Headphones: 200.00"

Если поле discount_price равно NULL, то Greatest вернет NULL. Чтобы избежать этого, можно использовать Coalesce:

from django.db.models import Coalesce, Value products = Product.objects.annotate( max_price=Greatest( 'price', Coalesce('discount_price', 'price') ) )

Пример

Используем Greatest для нахождения максимального значения между полем и константой. Например, найдем товары, у которых цена превышает минимальную цену 100:

from django.db.models import Greatest, Value # Товары, у которых максимальная цена (цена или 100) больше 150 products = Product.objects.annotate( max_price=Greatest('price', Value(100)) ).filter(max_price__gt=150) for product in products: print(f"{product.name}: {product.max_price}")

Результат выполнения кода:

"Laptop: 1500.00" "Smartphone: 800.00"

Пример

Greatest можно использовать для агрегации данных, например, для нахождения максимальной цены среди всех товаров:

from django.db.models import Max, Greatest # Находим максимум среди всех цен и цен со скидкой result = Product.objects.aggregate( global_max=Greatest( Max('price'), Max('discount_price') ) ) print(result)

Результат выполнения кода:

{'global_max': 1500.00}

Пример

Сравним две даты в модели Event и найдем более позднюю дату:

from django.db import models from django.db.models import Greatest class Event(models.Model): name = models.CharField(max_length=100) start_date = models.DateTimeField() end_date = models.DateTimeField() # Аннотируем событие с более поздней датой events = Event.objects.annotate( latest_date=Greatest('start_date', 'end_date') ) for event in events: print(f"{event.name}: {event.latest_date}")

Результат выполнения кода:

"Conference: 2025-12-15 18:00:00" "Workshop: 2025-11-10 15:30:00"

Смотрите также

  • класс Least,
    который возвращает минимальное значение из выражений
  • класс Max,
    который выполняет агрегацию для поиска максимального значения в наборе записей
  • класс Coalesce,
    который возвращает первое непустое значение из списка выражений
  • метод annotate,
    который добавляет аннотации к каждому объекту в QuerySet
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить