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

2024-10-03 17:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在唱django3.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(作为示例) 一种简单(但可能是DB密集型)的方法是遍历表中的行(即queryset的元素)——但我不想这样做——原因应该很明显

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

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

Tags: name模型modelmodelslengthnummaxat
2条回答

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

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的前几行

你可以简单地使用

def get_rows_satisfying_visit_count(number=100):
    MyModel.objects.filter(num_visits=number)[:N]

queryset将只返回满足num_vists条件的前N个元素。 您可能认为它将返回满足条件的所有对象,然后进行切片,但实际上,正在执行一个限制数据库操作,以便满足DB强度条件。 有关详细信息,请查看https://docs.djangoproject.com/en/3.2/topics/db/queries/#limiting-querysets

相关问题 更多 >