2016-10-10 52 views
0

我有三種狀態的模型:draft,launching,launched。我想要的是按特定順序顯示模型:首先草稿,然後啓動,然後啓動。我不想將我的屬性命名爲0_draft,1_launching,2_launched,因爲這將成爲一個問題;我需要清晰的值在我的數據庫。django ORM - 按狀態值排序

有沒有一種方法來註釋這些值與一些整數?

這個理想的語法應該是這樣的:

def detect_status_number(campaign): 
    if campaign.status == 'draft': 
     return 1 
    ... etc ... 

cs = Campaign.objects.annotate(new_arg=lambda campaign: detect_status_number(campaign)) 
cs = cs.order_by('new_arg').all() 

這顯然是行不通的;但有沒有辦法做到這一點?

回答

0

我認爲這會工作

cs = Campaign.objects.extra(
select={"weight_status":"case when campaign.status='draft' then 0 when campain.status = 'launching' then 1 else 2 end"} 
).order_by('weight_status') 
0

雖然可以肯定能讓你的方法工作,讓我推薦另一種方法:使用選擇字段和「枚舉」。這裏有一個例子:

STATUS_TYPE = (
    (1, "draft"), 
    (2, "launching"), 
    (3, "launched"), 
) 

然後爲模型字段:

status = models.IntegerField(choices=STATUS_TYPE) 

我意識到,如果你的模型設計已經設置,這可能不是一個可以接受的答案,但是這是一個不錯的設計模式要知道。