0

この問題に遭遇しました。あなたの助けを求めたいと思います。

コンテキスト: 私はボールの袋を持っています。それぞれのボールには年齢 (赤と青) と色の属性があります。

私が望むのは、トップ10の「最も若い」ボールを取得することであり、最大3つの青いボールがあります(これは、10の最も若いボールのリストに3つ以上の青いボールがある場合、「冗長な」最も古い青いボールを最年少の赤いボール)

トップ 10 を取得するには:

sel_balls = Ball.objects.all().sort('age')[:10]

ここで、「最大 3 個の青いボール」という条件も満たすために、さらに処理する必要があります。

  1. sel_balls を繰り返し、青いボール (= B) の数を数えます。
  2. B <= 3 の場合: 何もしない
  3. Else: 追加の B - 3 個の赤いボールを取得して、最も古い (B - 3) 個の青いボールを置き換えます (これらの赤いボールは、既に取り出した元の 10 個のボールに含まれていてはなりません)。赤いボールのリストの中で最も古い年齢の値を取得し、次のような別のクエリを実行することでこれを行うことができると思います。

    add_reds = Ball.objects.filter(年齢 >= 最古の年齢)[: B - 3]

私の質問は:

  1. 1 つのクエリだけで制約を満たす方法はありますか?
  2. 2 つのクエリを実行する必要がある場合、上記の 1 つの方法よりも高速な方法はありますか?

皆さんありがとう。

4

2 に答える 2

0

それを行うには、注釈を使用する必要があります。ドキュメントを参照してください。

.filter().annotate()に「WHERE」を与える

.filter()「HAVING」を与えた後.annotate()(これはあなたが必要とするものです)

于 2013-03-13T11:45:32.533 に答える
0

データベースへの複雑なクエリには Q を使用します: https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

于 2013-03-13T10:15:47.650 に答える