筛选查询,其金额字段的总和大于或小于数字
Filter Queries which sum of their amount field are greater or lesser than a number
假设这是我的模型:
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 条记录中,returns 前 5 条记录的总和为 1000。这就像拥有这些值:100,400,300,100,100。总和是 1000,所以它 returns 它们作为查询集。
可以用循环来实现它,但我正在尝试用 django orm 来处理它。
谁能帮我解决这个问题?
获取所有项目,
创建空 item_list,
遍历所有项目,
如果物品数量低于 1000
追加到 item_list.
items = Item.objects.all()
item_list = []
for item in items:
if item.amount < 1000:
item_list.append(item)
有一种方法可以使用 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)
这将 return 价格加起来小于或等于 1000 的前几个商品实例。
假设这是我的模型:
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 条记录中,returns 前 5 条记录的总和为 1000。这就像拥有这些值:100,400,300,100,100。总和是 1000,所以它 returns 它们作为查询集。 可以用循环来实现它,但我正在尝试用 django orm 来处理它。
谁能帮我解决这个问题?
获取所有项目, 创建空 item_list, 遍历所有项目, 如果物品数量低于 1000 追加到 item_list.
items = Item.objects.all()
item_list = []
for item in items:
if item.amount < 1000:
item_list.append(item)
有一种方法可以使用 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)
这将 return 价格加起来小于或等于 1000 的前几个商品实例。