2016-10-10 6 views
0

私はdraftlaunchinglaunchedの3つのステータスを持つモデルを持っています。私が欲しいのは、モデルを特定の順序で表示することです。最初の草案を作成し、それを起動してから起動します。私は0_draft1_launching2_launchedのように私の属性に名前をつけたくないのですが、これは道路上で問題になるでしょう。私は私のDBに明確な値が必要です。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) 

が、これは良いデザインです知るべきパターン。

関連する問題