如何根据字段值,给QuerySet的各条记录排序?

2013-08-04 17:26:55 +08:00
 halicando
例如:
tasks_list=tasks.objects.filter(update_time='today')
假设获得的tasks_list为 [task1,task2,...taskn]
每条记录都包含state这个字段,且state值可以为 'finished', ‘todo’,'delay'
那么如何根据state的值给tasks_list的各条记录排序?
比如优先级为'todo','finished','delay'
3368 次点击
所在节点    Python
6 条回复
cxe2v
2013-08-04 18:31:43 +08:00
优先级这个没法设置吧,除了你给state赋予数字前缀,前缀就是优先级,或者来个state2字段给定优先级,当然灵活一点的是另建一张表,用state作为外键,另一个字段为优先级,这样就可以实现排序了
felix021
2013-08-04 19:31:08 +08:00
一句话:

tasks_list.sort(key=lambda x: {'todo': 1, 'finished': 2, 'delay': 3}[x.state])
z4none
2013-08-04 20:18:23 +08:00
如果是 MySQL :
select * from table where update_time='today' order by field (field, 'todo', 'finished', 'delay');
z4none
2013-08-04 20:19:46 +08:00
好吧 是 order by field (state, 'todo', 'finished', 'delay');
hahastudio
2013-08-05 11:19:05 +08:00
其实吧,你还是改SQL语句更划算= =我觉得= =
raquelken
2013-08-05 11:41:01 +08:00
你可以这样做 tasks_list=tasks.objects.filter(update_time='today').extra(select={"ordering": "case when state='todo' then 1 when state='finished' then 2 when state='delay' then 3 else 4 end"}).order_by('ordering')

但个人更建议你加字段

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77963

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX