如何在django中对字典进行排序?

时间:2016-11-17 08:52:52

标签: django python-3.x sorting dictionary django-views

我是编程方面的新手,我在django遇到了一个问题。

所以我正在尝试根据值对字典进行排序。我尝试过这里看到的几种方法,但事情对我来说没什么用。它制作了字典,但我不知道它为什么不排序。

所以'scoruri'是字典:在html中使用时它会显示如下{User:alex_py:6,User:ion:3,User:lil:1,User:sss:1,User:ddd:1 ,用户:bbb:7},'结果'是每个'用户'(键)的分数。 当我打印scoruri类型时,它会打印6次(输入'dict')

有可能每个键:scoruri中的值实际上是一个字典,所以我有一本字典词典?

以下是我尝试排序的方法。

views.py

def home(request):
    data = dict()
    data['users'] = User.objects.all()
    data['scoruri'] = dict()

    if request.method == "POST":
        for key in request.POST:
            if 'nota_' in key:
                nota_acordata = Punctaj.objects.filter(acordat_de=request.user,
                                                       acordat_catre__id=key.split('_')[1]).first()
                if nota_acordata:
                    nota_acordata.nota = request.POST.get(key)
                    nota_acordata.save()

                else:
                    Punctaj.objects.create(acordat_de=request.user,
                                           acordat_catre_id=key.split('_')[1],
                                           nota=request.POST.get(key))  

                    messages.success(request, "Successfully Voted")
        return redirect('home')

    for user in data['users']:
        suma = Punctaj.objects.filter(acordat_catre=user).aggregate(punctaj=Sum('nota')).get("punctaj")
        count = Punctaj.objects.filter(acordat_catre=user).count()
        if not suma:
            result = 0
        else:
            result = int(suma)/count
        data['scoruri'][user] = result

        # sorted(data['scoruri'].items())
        # rezultate = sorted(data['scoruri'].items(), key=operator.itemgetter(1))
        print(type(data['scoruri']))
    return render(request, "login/home.html", data)

模板

{{ scoruri }}
<!--{{ rezultate }}-->

<!--{% for key, value in scoruri %}-->

       <!--{{ key }}:{{ value }}-->

<!--{% endfor %}-->

2 个答案:

答案 0 :(得分:2)

您应该使用保留广告订单而不是OrderedDict的{​​{1}}。 https://docs.python.org/2/library/collections.html

dict

在模板中

from collections import OrderedDict

def home(request):
    data = dict()
    data['users'] = User.objects.all()
    data['scoruri'] = dict()

    if request.method == "POST":
        for key in request.POST:
            if 'nota_' in key:
                nota_acordata = Punctaj.objects.filter(acordat_de=request.user,
                                                       acordat_catre__id=key.split('_')[1]).first()
                if nota_acordata:
                    nota_acordata.nota = request.POST.get(key)
                    nota_acordata.save()

                else:
                    Punctaj.objects.create(acordat_de=request.user,
                                           acordat_catre_id=key.split('_')[1],
                                           nota=request.POST.get(key))  

                    messages.success(request, "Successfully Voted")
        return redirect('home')

    for user in data['users']:
        suma = Punctaj.objects.filter(acordat_catre=user).aggregate(punctaj=Sum('nota')).get("punctaj")
        count = Punctaj.objects.filter(acordat_catre=user).count()
        if not suma:
            result = 0
        else:
            result = int(suma)/count
        data['scoruri'][user] = result

        # sorted(data['scoruri'].items())
        # sorting and puting result into OrderedDict
        data['scoruri'] = OrderedDict(sorted(data['scoruri'].items(), key=operator.itemgetter(1)))
        print(type(data['scoruri']))

    return render(request, "login/home.html", data)

答案 1 :(得分:0)

您无法对字典进行排序,您可以对字典的表示进行排序。字典有一个随机的有序成员。

您可以从dict成员列出元组列表:

import operator
dict = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_dict = sorted(dict.items(), key=operator.itemgetter(1))

我希望这会有所帮助。