2017-01-11 4 views
1

Я посмотрел на это thread, на примере сортировки словарей.Заказать словарь в контексте Django

У меня есть словарь программных объектов, где ключ является программным объектом, а значение представляет собой поиск количества связанных объектов проекта.

def DepartmentDetail(request, pk): 
    department = Department.objects.get(pk=pk) 
    programmes = Programme.objects.all().filter(department=department).exclude(active=False).order_by('long_name') 
    combi = {} 
    for p in programmes: 
     prj = Project.objects.all().filter(programme=p) 
     combi[p] = str(len(prj)) 
    return render(request, 'sysadmin/department.html',{'department': department, 'programmes': programmes, 'combi': sorted(combi.items())}) 

В модели, программа возвращает строку «» параметра long_name, поэтому я считаю, что я пытаюсь разобраться строковый ключ и значение строки.

В шаблоне я получаю до ключей и значений, как это так,

{% for programme, n in combi %} 

Это дает мне ошибку ..

unorderable types: Programme() < Programme() 

Я не очень понимаю ошибку, в python 3 documentation он заявляет, что метод sorted() принимает любое итеративное значение. Так почему это происходит?

Я смотрю на коллекции. ЗаряжаемыйDict для решения проблемы, но я хочу знать, почему это не работает.

Thanx.

ответ

3

Базы данных с индексом на столбцах действительно хороши при сортировке. На клиентской стороне почти не нужно сортировать. Вы почти всегда можете делать это на сервере. Смешная часть, которую вы, по-видимому, знаете, как это сделать.

....exclude(active=False).order_by('long_name') # <--- this 

Угадайте, что, ваши данные уже отсортированы, вам не нужно сортировать их снова внутри python !!

Но в вашем коде есть гораздо большая проблема. Вы извлекаете набор из Project элементов, а затем перебираете этот набор, чтобы поочередно возвращать их один за другим. Поэтому, если у вас есть 200 Project элементов, вы делаете 200 запросов, когда один запрос выполняет задание так же хорошо. Просто добавьте select_related или prefetch_related в зависимости от того, в каком направлении у вас есть отношения.

Ваш код в идеале должно быть что-то вроде этого

department = Department.objects.get(pk=pk) 
    programmes = Programme.objects.all().filter(department=department).exclude(active=False).order_by('long_name') 
    return render(request, 'sysadmin/department.html',{'department': department, 'programmes': programmes,}) 

Насколько я могу видеть, комби содержит только дублированные данные. То же самое можно получить от programmes например. programme.project_set.all() (опять же это зависит от того, в каком направлении вы имеете отношения, ваши модели не показаны)

Рекомендуемая литература: https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey

+0

Я смотрю на связанную с сервером серверную часть проектов (поскольку это единственный способ, о котором я могу думать), вы предлагаете мне сделать это на стороне клиента? Если да, то каков был бы правильный способ сделать это? – Xeberdee

+0

Просто посмотрел, каковы значения combi на самом деле, и казалось бы, что добавление 'annotate (project_count = Count ('project'))' будет необходимо – Sayse

+0

Пожалуйста, см. Обновление – e4c5

0

Вопрос заключается в том, что sorted ожидает способ, чтобы иметь возможность заказать элементы и по умолчанию нет никакого способа узнать, как заказать объекты. Вы можете указать ключ

sorted(combi.items(), key=lambda i: i.long_name) 
+0

Хотя это может устранить ошибку «неупорядоченные типы», вы должны использовать [решение e4c5] (http://stackoverflow.com/a/41586684/1324033) – Sayse

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