Фильтр запросов, сумма полей которых больше или меньше числа

Допустим, это моя модель :

class Item(models.Model):
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    price = models.DecimalField(max_digits=23, decimal_places=8, null=True, blank=True)
    amount = models.DecimalField(max_digits=23, decimal_places=8)

Я пытаюсь получить все записи, сумма которых будет меньше, чем любое целое число, которое я задаю. Например, из 20 записей, которые существуют, он возвращает первые 5 записей, сумма которых равна 1000. Это как если бы у меня были эти значения: 100,400,300,100,100. сумма равна 1000, поэтому он возвращает их как набор запросов. Это можно реализовать с помощью циклов, но я пытаюсь сделать это с помощью django orm .

может ли кто-нибудь помочь мне с этим?

Получает все элементы, Создайте пустой список_элементов, Перебираем все элементы, Если сумма элемента меньше 1000 добавить в список элементов.

    items = Item.objects.all()
    item_list = []
    for item in items:
        if item.amount < 1000:
          item_list.append(item)
<
from django.db.models import Sum
amount_sum = Item.objects.filter(amount__lt=1000).aggregate(amount_sum=Sum("amount"))["amount_sum"]
Есть способ сделать это с помощью агрегатной функции Sum из Django.

Однако, вышеприведенный Django запрос будет иметь эквивалентный SQL запрос в виде:

SELECT SUM("app_Item"."amount") AS "amount_sum" 
FROM "app_Item" 
WHERE "app_Item"."amount" < 1000; args=(Decimal('1000'),)

Вы можете использовать функции Window для запуска кумулятивной суммы для каждой строки, упорядоченной по первичному ключу, следующим образом:

from django.db.models import Sum, Window


Item.objects.annotate(
    cumulative_sum=Window(
        Sum('price'),
        order_by=F('id').asc()
    )
).filter(cumulative_sum__lte=1000)

В результате будут возвращены первые несколько экземпляров товаров с ценой, которая меньше или равна 1000.

Вернуться на верх