首页 > 解决方案 > Django模型查询总和为给定数字的前N行

问题描述

我在唱 Django 3.2

我有一个这样的模型:

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    num_visits  = models.PositiveSmallNumber()
    created_at  = models.DateTimeField()

    class Meta:
        ordering = ['created_at']

我想选择前 N 行,其中访问次数的累积总和= 100(例如) 一个简单的(但可能是数据库密集型的方式)是遍历表中的行(即查询集) - 但我不想这样做 - 原因应该很明显。

如何编写一个查询来获取访问总和为指定数字的前 N ​​行?

def get_rows_satisfying_visit_count(cumulative_sum_in_field=100):
    MyModel.objects.filter(/* what ? */)

标签: pythondjangodjango-modelsdjango-querysetdjango-q

解决方案


您可以对查询集使用切片运算符:

def get_rows_satisfying_visit_count(visits=100, rows=100):
    return MyModel.objects.filter(num_visits=number)[:rows]

编辑:使用更新后的问题,来自 Django >= 2.0,您可以使用Windowand执行此操作Sum

MyModel.objects.annotate(
    cumulative_sum=Window(
        Sum('num_visits'),
        order_by=F('id').asc()
    )
).filter(cumulative_sum__lte=100)

这将获得累积总和小于或等于 100 的前几行。


推荐阅读