Filter查询其amount字段的总和大于或小于某个数字



假设这是我的模型:

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。

有人能帮我一下吗?

有一种方法可以做到这一点,使用Django中的聚合函数Sum。

from django.db.models import Sum
amount_sum = Item.objects.filter(amount__lt=1000).aggregate(amount_sum=Sum("amount"))["amount_sum"]

然而,上面的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的商品实例。

的所有项目,创建空item_list,遍历所有项目,如果项目金额低于1000附加item_list。

items = Item.objects.all()
item_list = []
for item in items:
if item.amount < 1000:
item_list.append(item)

相关内容

  • 没有找到相关文章

最新更新