Django查询 - 获取前x个元素,这些元素一起超过字段的特定量

时间:2017-10-20 08:07:43

标签: sql django django-queryset

我想请求前面超过特定数量的x个元素,我不知道这是否可能。 所以假设这是我的模型:

class Article(models.Model):
     price = models.DecimalField(default=0.0, max_digits=7, decimal_places=2)

现在,如果我按Articles订购price,我希望第一个Articles一起超过price,即100美元。 这是否可以通过注释,求和,额外()或其他任何方式实现?

Article.objects.order_by("price")

例如: 我有3篇文章:

Article1 (price=50 Dollar)
Article2 (price=60 Dollar)
Article3 (price=20 Dollar)

....现在我想要的文章一起超过100美元的价格......所以这将是第1条和第2条。总价值为110美元

原始sql语句中的这个答案会欺骗他但我不知道如何使用django语法来解决这个问题 limiting the rows to where the sum a column equals a certain value in MySQL

1 个答案:

答案 0 :(得分:1)

我不认为你能够完全使用数据库查询。您链接的SQL问题的答案需要存储过程,或者非常昂贵(O(N ^ 2))。

您可以使用有效运行的迭代器查询来实现相同的功能,并且需要在Python中进行非常简单的操作。像这样:

articles = Article.objects.order_by("price").iterator()
to_update = []
total = 0
for article in articles:
    total += article.price
    if total > 100:
        break
    to_update.append(article.pk)

# Select the affected objects for update
Article.objects.select_for_update().filter(pk__in=to_update)

因为您正在使用iterator(),所以您只会从数据库中提取所需的项目。