Класс 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