Класс Least
Класс Least применяется в выражениях Django для получения минимального значения из списка переданных аргументов. Он полезен при аннотациях, фильтрации и агрегациях, когда требуется выбрать наименьшее значение среди нескольких полей или выражений. Класс принимает произвольное количество аргументов, каждый из которых может быть полем модели, числовым значением или выражением.
Синтаксис
from django.db.models import Least
Least(expression1, expression2, ..., **extra)
Пример
Рассмотрим модель Product с несколькими ценовыми полями. Найдем наименьшую цену для каждого товара:
from django.db import models
from django.db.models import Least, F
class Product(models.Model):
name = models.CharField(max_length=100)
price_1 = models.DecimalField(max_digits=10, decimal_places=2)
price_2 = models.DecimalField(max_digits=10, decimal_places=2)
price_3 = models.DecimalField(max_digits=10, decimal_places=2)
# Find the lowest price for each product
products = Product.objects.annotate(
lowest_price=Least('price_1', 'price_2', 'price_3')
)
for product in products:
print(f"{product.name}: {product.lowest_price}")
Результат выполнения кода:
"Laptop: 999.99"
"Phone: 499.99"
"Tablet: 299.99"
Пример
Используем Least вместе с F выражениями и фильтрацией для поиска товаров, у которых минимальная цена ниже определенного значения:
from django.db.models import F, Least, Q
# Find products where the lowest price is less than 500
products = Product.objects.annotate(
lowest=Least(F('price_1'), F('price_2'), F('price_3'))
).filter(lowest__lt=500)
for product in products:
print(f"{product.name}: {product.lowest}")
Результат выполнения кода:
"Phone: 499.99"
"Tablet: 299.99"
Пример
Можно использовать Least с константными значениями и в комбинации с другими агрегатными функциями:
from django.db.models import Min, Least, Value
# Use Least with constants and aggregate functions
products = Product.objects.annotate(
min_price=Min('price_1'),
threshold=Least('min_price', Value(1000))
)
for product in products:
print(f"{product.name}: min price = {product.min_price}, threshold = {product.threshold}")
Результат выполнения кода:
"Laptop: min price = 999.99, threshold = 999.99"
"Phone: min price = 499.99, threshold = 499.99"