我想请求前面超过特定数量的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
答案 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()
,所以您只会从数据库中提取所需的项目。