2017-10-20 2 views
1

これは、特定の量を超える最初のx要素を要求したいのですが、これが何とか可能かどうかわかりません。 だから、これは私のモデルであると仮定すると:私はpriceArticlesを注文した場合Djangoクエリ - フィールドの特定の量を超えて最初にx個の要素を取得する

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

は今、私は一緒のが100ドルを言わせてのpriceを超えた最初のArticlesをしたいです。 注釈、合計、余分()など何でも可能ですか?

例えば
Article.objects.order_by("price") 

:そう、これは1条とArticle2だろう...今、私は一緒に100ドルの価格を超える記事をしたい....

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

: 私は3件の記事を持っています。一緒値は110ドル

彼のトリックをDIRう生のSQL文でこの答えが、私はDjangoの構文でそれを解決する方法がわからないです、私はあなたがこれをできるようになるとは思わない limiting the rows to where the sum a column equals a certain value in MySQL

+0

最初のx要素はどうですか?最初に作成されましたか? –

+0

私は3つの記事を持っているとしましょう:Article1(価格= 50ドル)Article2(価格= 60ドル)とArticle 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を実行する必要があるということです。これはクエリセットでのみ可能です:/ –

関連する問題