2013-09-24 77 views
0

我試圖通過CharField「名稱」來訂購查詢集,但我想排除「其他」條目並將其添加爲用戶選擇的最後一個選項。 ..將特定條目添加到Queryset的末尾

self.fields["acquisition"].queryset = AcquisitionChannel.objects.exclude(name = "Other").order_by('name') 

以上,顯然不是一件好事,因爲它排除了「其他」 ...

難道是在Django做了什麼?或者我必須使用Javascript?

謝謝!

回答

0

手動對象添加到一個QuerySet,嘗試_result_cache

other = AcquisitionChannel.objects.get(name="Other")  
objs = AcquisitionChannel.objects.exclude(name="Other").order_by("name") 
len(objs) #hit the db to evaluate the queryset. 
objs = objs._result_cache.append(other) 
self.fields["acquisition"].queryset = objs 
+0

當我調試它看起來像查詢集有所有的項目,但在瀏覽器中的「其他」缺少。我不知道爲什麼... – TidharPeer

+0

添加此:objs = objs._result_cache.append(其他) - 更新我的代碼以反映。 –

+0

我已經試過這個了...這會將目標更改爲無 – TidharPeer

0

快速而簡單:添加一個order列需要使用extra()一個特殊值:

self.fields["acquisition"].queryset = (
    AcquisitionChannel.objects 
    .extra(select={'order': '(CASE name WHEN %s THEN 1 ELSE 0 END)'}, 
      select_params=['Other'], 
      order_by=['order', 'name'])) 

使用params,這種方法適用於任何數據庫(支持CASE)。

+0

沒有工作...並且無論如何我不想強迫自己或其他任何人使用特定的DB ...感謝嘗試 – TidharPeer

+0

它工作正常這裏相當不錯。它顯示了錯誤消息還是什麼? –

+0

數據庫錯誤 - 「其他」列不存在 – TidharPeer

0

它是這樣的:

def get_choices(): 
    choices = AcquisitionChannel.objects.exclude(name = "Other").order_by('name').values_list('value_column', 'text_column') 
    other = AcquisitionChannel.objects.filter(name = "Other").values_list('value_column', 'text_column') 
    choices = list(choices) 
    other = list(other) 
    return choices + other 

則:

acquisition = forms.ChoiceField(choices=get_choices()) 
+0

這種類型的所有選項 - 包括「其他」,到了最後並沒有把它.. – TidharPeer

+0

是,這是行不通的。如何ChoiceField和設置選擇一些values_list,然後你可以追加。 – metaphy

+0

但是,它不會來自數據庫...所以如果下週將添加一個新值,選擇字段將不會更新 – TidharPeer