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 日”之后。为什么会这样?

4

2 回答 2

2

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

于 2012-07-21T09:47:07.920 回答
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)
于 2012-07-21T11:32:03.393 回答