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

通常、OrderedDict に関する @BrenBarn のアドバイスは適切ですが、この場合は正しくない可能性があります。テンプレートで何をしているかによって異なります。dumpsこれはのように見えjson.dumpsます。この場合、おそらく JSON 文字列を HTML に書き込んでいます。その場合、JSON は順序付けされるため、OrderedDict は役に立たないかもしれませんが、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 に答える