2017-10-20 84 views
1

我想要求第一個x元素合在一起超過特定數量,我不知道這是否有可能。 因此,假如這是我的模型:Django查詢 - 獲取第一個x元素,它們合在一起超過特定數量的字段

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

現在如果我爲了Articlesprice我想第一Articles一起超過比方說100美元的price。 這是否有可能與註釋,總結,額外()或任何??

Article.objects.order_by("price") 

例如: 我有3條:

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

....現在我想一起超過100美元的價格文章...所以這將是第一條和第二條。值一起110美元

這個答案在原始的SQL語句將DIR他的技巧,但我不知道如何解決與Django的語法 limiting the rows to where the sum a column equals a certain value in MySQL

+0

How do you say第一個x元素?首先創建? –

+0

比方說,我有3篇文章:第1條(價格= 50美元)第2條(價格= 60美元)和第3條(價格= 20美元)....現在我想要的文章共同超過100美元的價格。所以這將是第1條和第2條。加起來的價值是110美元 –

+0

我想不出任何東西,沒有使用forloop。 –

回答

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()你只會獲取您從數據庫中需要的項目。

+0

這是什麼:Article.objects.annotate(total_price = Sum(,price'))。filter(total_price__lte = 100)?我想我會嘗試一下 –

+0

嘗試一下...我不確定它會起作用,如果它確實會是O(N^2),比迭代更昂貴。 – solarissmoke

+0

問題是,我需要做一個select_for_update,這只是在查詢集上可能:/ –

相關問題