django ORM - 按状态值

时间:2016-10-10 15:21:07

标签: django

我有一个包含三种状态的模型:draftlaunchinglaunched。我想要的是按特定顺序显示模型:首先草稿,然后启动,然后启动模型。我不想将我的属性命名为0_draft1_launching2_launched,因为这将是一个问题;我需要在数据库中使用明确的值。

有没有办法用一些整数来注释这些值?

理想的语法如下所示:

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()
这显然不起作用;但有没有办法使这项工作?

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:0)

虽然你当然可以让你的方法有效,但我还是建议另一种方法:使用选择字段和“枚举”。这是一个例子:

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

然后是您的模型领域:

status = models.IntegerField(choices=STATUS_TYPE)

我意识到如果您的模型设计已经设置,这可能不是一个可接受的答案,但这是一个很好的设计模式。