Класс Greatest

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

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

Синтаксис

pythonfrom django.db.models import Greatest

Greatest(expression1, expression2, ..., output_field=None)

Параметры:

Пример

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

pythonfrom 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}")

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

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

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

pythonfrom django.db.models import Coalesce, Value

products = Product.objects.annotate(
  max_price=Greatest(
    'price',
    Coalesce('discount_price', 'price')
  )
)

Пример

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

pythonfrom 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}")

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

python"Laptop: 1500.00"
"Smartphone: 800.00"

Пример

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

pythonfrom django.db.models import Max, Greatest

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

print(result)

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

python{'global_max': 1500.00}

Пример

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

pythonfrom 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}")

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

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

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

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