我有一个包含三种状态的模型:draft
,launching
,launched
。我想要的是按特定顺序显示模型:首先草稿,然后启动,然后启动模型。我不想将我的属性命名为0_draft
,1_launching
,2_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()
这显然不起作用;但有没有办法使这项工作?
答案 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)
我意识到如果您的模型设计已经设置,这可能不是一个可接受的答案,但这是一个很好的设计模式。