Класс Least

Класс Least применяется в выражениях Django для получения минимального значения из списка переданных аргументов. Он полезен при аннотациях, фильтрации и агрегациях, когда требуется выбрать наименьшее значение среди нескольких полей или выражений. Класс принимает произвольное количество аргументов, каждый из которых может быть полем модели, числовым значением или выражением.

Синтаксис

pythonfrom django.db.models import Least

Least(expression1, expression2, ..., **extra)

Пример

Рассмотрим модель Product с несколькими ценовыми полями. Найдем наименьшую цену для каждого товара:

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

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

python"Laptop: 999.99"
"Phone: 499.99"
"Tablet: 299.99"

Пример

Используем Least вместе с F выражениями и фильтрацией для поиска товаров, у которых минимальная цена ниже определенного значения:

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

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

python"Phone: 499.99"
"Tablet: 299.99"

Пример

Можно использовать Least с константными значениями и в комбинации с другими агрегатными функциями:

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

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

python"Laptop: min price = 999.99, threshold = 999.99"
"Phone: min price = 499.99, threshold = 499.99"

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

  • класс Greatest,
    который возвращает максимальное значение из переданных выражений
  • метод aggregate,
    который вычисляет агрегатные значения для всего QuerySet
  • метод annotate,
    который добавляет вычисляемые поля к каждому объекту QuerySet
  • класс Min,
    который находит минимальное значение в столбце