python - 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 ? */)
解决方案
您可以对查询集使用切片运算符:
def get_rows_satisfying_visit_count(visits=100, rows=100):
return MyModel.objects.filter(num_visits=number)[:rows]
编辑:使用更新后的问题,来自 Django >= 2.0,您可以使用Window
and执行此操作Sum
:
MyModel.objects.annotate(
cumulative_sum=Window(
Sum('num_visits'),
order_by=F('id').asc()
)
).filter(cumulative_sum__lte=100)
这将获得累积总和小于或等于 100 的前几行。
推荐阅读
- macos - 如何使用苹果芯片 M1 在 Mac 上为 arm64 编译 libwebp?
- python - 从python的正则表达式(re.findall)中的给定文本中提取医生姓名
- linux - Linux 将 USB 端口与设备关联
- duplicates - Artemis 在故障转移后收到重复消息
- macos - 使用 launchctl 2,如何从已经在 macOS >= 10.10 上运行的服务推断域?
- python - Python - 求解瞬态矩阵微分方程
- javascript - 为什么我的网页内容重叠?
- c# - Swagger Web 应用程序的 Azure Blob 获取错误之后
- python - 变量的内联初始化
- javascript - 如何在javascript中每5个数字的范围之间生成随机数