2013-03-13 80 views
0

我遇到了這個問題,並希望尋求您的幫助。使用Django查詢過濾項目

背景: 我有一袋球,每個球都有一個年齡(紅色和藍色)和顏色屬性。

我想要的是獲得前10名「最年輕」的球,並且最多有3個藍色球(這意味着如果在10個最小的球列表中有3個以上的藍色球,則替換「redudant」與年輕的紅球最古老的藍色球)

要獲得前10名:

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

現在,也滿足「至多3個藍色球」的條件,我需要進一步處理:

  1. 迭代通過^ h sel_balls和計數藍色球的(B =)
  2. 若B < = 3的號碼:什麼也不做
  3. 否則:獲得追加B - 3顆紅球,以取代舊(B - 3)藍色球(和這些紅球肯定不會出現在已經取出的原始10個球中)。我想我可以通過獲取紅球列表中最早的年齡值做到這一點,不喜歡另一個查詢:

    add_reds = Ball.objects.filter(年齡> = oldest_sel_age)[:乙 - 3]

我的問題是:

  1. 有沒有辦法,我能滿足只有一個查詢的約束什麼辦法?
  2. 如果我必須做2個查詢,有沒有比我上面提到的方法更快的方法?

謝謝大家。

+0

你有沒有嘗試在模型中的類方法的功能?你可以在那裏做你的邏輯,你可以在你的視圖中這樣稱呼它:'sel_balls = Ball.sort_balls' – catherine 2013-03-13 08:35:40

回答

0

您應該使用註釋來做到這一點。 見documentation

.annotate().filter()給 'WHERE'

.filter().annotate()後給出了 '具有'(這是你所需要的)