2012-07-21 31 views
0

我有这样的“视图”(django的):为什么字典编码搞乱我的查询集的顺序

def preview(request,war_id): 
    set = stats.objects.filter(warval=get_object_or_404(war,pk=war_id)).order_by('date') 
    for each in set: 
     print(each.date) 
    f={} 
    for each in set: 
     date = each.date.strftime('%d %b %Y') 
     f[date] = each.views 
    print(f) 
    return render_to_response('statistics/preview.html',RequestContext(request,{"data":dumps(f)})) 

并且它示出了在命令提示的输出如下所示:

2012-07-01 
2012-07-11 
2012-07-14 
2012-07-19 
2012-07-21 

{'01 Jul 2012': 34, '11 Jul 2012': 1, '14 Jul 2012': 20, '21 Jul 2012': 6, '19 Jul 2012': 23} 

正如你从上面看到的输出,在字典编码“2012年7月19日”之后是“2012年7月21日”。为什么发生这种情况?

回答

2

字典无序。如果您关心内容的顺序,请不要使用它们。 collections.OrderedDict类提供了一个等同的顺序,但请注意,这是基于插入顺序,而不是按键的排序顺序。

+0

但是我怎么插入OrderedDict元素? – 2012-07-21 10:13:16

+0

阅读文档。 – BrenBarn 2012-07-21 18:15:31

1

@ BrenBarn关于OrderedDict的建议通常很好,但在这种情况下可能并不正确。这取决于你在模板中做什么。它看起来像dumps这里是json.dumps,在这种情况下,你可能会写一个JSON字符串到你的HTML。在这种情况下,OrderedDict可能没有帮助,因为JSON将被排序,但是您将在JavaScript中使用JSON,这可能会以任意顺序再次生成值。

如果你关心的顺序,你应该产生列表,而不是一个字典的列表,以便它是作为在每一个阶段的有序序列治疗:

f = [] 
for each in set: 
    date = each.date.strftime('%d %b %Y') 
    f.append([date, each.views]) 
print(f) 
相关问题