LINUX.ORG.RU

подобрать выборку для шаблона

 ,


0

1

Имеется модель:

class Data(models.Model):
    login =  models.ForeignKey(User)
    sec =  models.PositiveIntegerField(u'section')
    f = models.PositiveIntegerField(u'data', default=2)
    def __unicode__(self):
        return str(self.f)

Задача:

Нужно сделать выборку для списка значений sec, который обзначим list_section и отобразить их в шаблоне по секциям. При этом результаты выборки в каждой sec нужно пронумировать. Т.е., например, list_section=[1,2,3], то сначала например результаты выборки для sec=1, затем sec=2 ...:

sec = 1

1. первая запись выборки для sec = 1

2. вторая запись выборки для sec = 1

...

sec = 2

1. первая запись выборки для sec =2

2. вторая запись выборки для sec =2

...

казалось бы, наиболее эффективно выбрать так, за один раз

list_section=[1,2,3,4]
context['data']=Data.objects.filter(sec__in = list_section).values('sec','f')
context['data']
[{'sec': 1L, 'f': 2L}, {'sec': 2L, 'f': 4L}, {'sec': 1L, 'f': 22L}, {'sec': 3L, 'f': 33L}, {'sec': 4L, 'f': 44L}]
но при разборе в шаблоне возникают проблемы: сначала во внешнем цикле перебирать все возможные значения sec, а затем во внутреннем цикле перебирать результаты выборки. При этом не возможно пронумеровать результаты выборки по каждой теме.

другой вариант: делать выборку в цикле

for s in list_section:
    context[s]=Data.objects.filter(sec=s).values('sec','f')
в шаблоне опять приходится перебираь все возможные значения sec, и если contex[cur_sec] не пустой, то организовывать второй внутренний цикл. При этом можно и нумеровать результат в каждой sec. Задача решена, но, мне не нравиться выборка в цикле.

Можно ли как-то решить задачу и обойти выборку в цикле?



Последнее исправление: cetjs2 (всего исправлений: 4)

Не отвечайте ему, пока не прочитает документацию! Хотя бы tutorial!

anonymous
()
Ответ на: комментарий от bj

В документации сказано

Группировка по другим свойствам

Можно группировать объекты по методу, атрибуту, ключу словаря и списку объектов, в общем по всему, к чему можно получить доступ в шаблоне.

но попытка перегрупировать выборку по двум полям

{% regroup datas by [owner__userprofile__last_name,owner__userprofile__last_name]  as data_list %}
вызывает ошибку
Could not parse the remainder

Если оставлять что-то одно owner__userprofile__last_name или owner__userprofile__midlle_name, то все успешно работает.

django2014
() автор топика
Ответ на: комментарий от django2014

Не читай советских газет. В русской доке попутали объект и субъект.

А вообще, совет на будущее, бросай джангу, у нее куда не глянь, везде все плохо. Шаблонизатор из коробки нихрена не умеет и расширяется через жопу.

bj
()
Ответ на: комментарий от bj

в английской доке сказано элементы списка (list item).

Any valid template lookup is a legal grouping attribute for the regroup tag, including methods, attributes, dictionary keys and list items.

Советские газеты не причем )

django2014
() автор топика
Ответ на: комментарий от bj

а может это можно понимать как список элементов )

django2014
() автор топика
Ответ на: комментарий от django2014

Элементы списка в выражении. Например можно группировать по первому элементу свойтва объекта. obj.list_prop.0

bj
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.