2016-11-17 4 views
0

Я новичок в программировании, и я столкнулся с проблемой в джанго.Как отсортировать словарь в django?

Так что я пытаюсь сортировать словарь на основе значения. Я пробовал несколько методов, которые можно увидеть здесь, но для меня ничего не работает. Он работал, чтобы сделать словарь, но я не знаю, почему он не сортируется.

Так что «scoruri» - это словарь: при использовании его в html он отображается следующим образом {User: alex_py: 6, User: ion: 3, User: lil: 1, User: sss: 1, User: ddd: 1, User: bbb: 7}, 'result' - это оценка для каждого пользователя (ключа). Когда я печатаю тип 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 %}--> 
+0

Некоторое время в декабре Python 3.6 будет выпущен, который имеет словарей, которые всегда отсортированные по умолчанию! – RemcoGerlich

+0

Возможный дубликат [Сортировка словаря Python по значению] (http://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value) –

+0

привет, я пробовал это: он прокомментирован rezultate = sorted (data ['scoruri']. items(), key = operator.itemgetter (1)), когда я использую {{rezultate}} в своем шаблоне, он ничего не покажет. –

ответ

1

Вы должны использовать OrderedDict, который сохраняет заказ на размещение вместо dict. https://docs.python.org/2/library/collections.html

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) 

И в шаблоне

{% for key, value in scoruri.items %} 
    {{ key }}:{{ value }} 
{% endfor %} 
+0

хорошо, мне это действительно не нужно, у меня есть красный цвет, я просто хочу заказать словарь по счету, который имеет каждый пользователь, вот и все. –

+0

ok, так что теперь, если я делаю это как вы, я получу ошибку для объекта «int», не имеет атрибута «rate», после чего я пробовал без него: OrderedDict (отсортировано (данные ['scoruri']. Items(), key = lambda i: i [1])), и он работал, он их заказывал, но результат был именно таким: OrderedDict ([, 1), (, 1), (, 1), (, 3), (<Пользователь: alex_py>, 6), (, 7)]), если я получу OrderedDict из кода, он даст мне это: индексы списка должны быть целыми, а не пользователем, поэтому он заказывает но он выдает OrderedDict, а также –

+0

@NitaAlexandru извините. (data ['scoruri']. items(), key = lambda i: i [1])) 'или' data ['scoruri'] = OrderedDict (отсортировано (отсортировано) (data ['scoruri']. items(), key = operator.itemgetter (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)) 

Я надеюсь, что это помогает.

+0

Если я делаю это: sorted_dict = sorted (data ['scoruri']. Items(), key = operator.itemgetter (1)) и использовать {{sorted_dict}} в html, он ничего не показывает. –

Смежные вопросы