为什么字典编码会破坏我的查询集的顺序

时间:2012-07-21 09:46:10

标签: python django dictionary

我有这个'视图'(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}

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

如果您关心订单,您应该生成列表而不是字典,以便在每个阶段将其视为有序序列:

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