python - Django 模型查询总和为给定数字的前 N ​​行

标签 python django django-models django-queryset django-q

我唱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 ? */)

最佳答案

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

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

编辑: 通过更新的问题,从 Django >= 2.0 开始,您可以使用 WindowSum 来完成此操作:

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

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

关于python - Django 模型查询总和为给定数字的前 N ​​行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68602061/

相关文章:

Python - 登录后Django站点管理页面为空

python - 有没有比 Python 的 strftime 更快的替代方法?

python - 艰难地学习 Python Ex 25 : local variable/object assignment in functions

python - 返回最长的字母子串

python - Django 多对多查询集过滤器

python - Django Python ...更新数据库中的多个元素

python - 有人可以给我关于这个优化策略的两分钱吗

django - 从 Django View 中的多个表中获取数据

django - 无法将关键字 u'slug' 解析为 Django 中的字段错误?

python - MultipleChoiceField 未在 Django Admin 中显示存储的值