2012-07-21 35 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) 
相關問題