Форум сайта python.su
Такая проблема.
Для объектов f имеются отзывы otzyv. Непосредственно в шаблоне нужно сосчитать кол-во отфильтрованных отзывов, пишу так:
{{ f.otzyv_set.filter(mark=1)|length }}
b.entry_set.filter(headline__contains='Lennon')
Отредактировано (Ноя. 14, 2010 23:46:50)
Офлайн
Мне кажется фильтровать в шаблоне неверно, это нарушение MVC. Другими словами выборку нужно делать в view.
Офлайн
AlexKiriukhaСкорей всего, полностью соглашусь с Вами, но всё равно не могу сообразить как сделать то что мне надо. Попробую объяснить подробнее, наверняка есть простое решение.
Мне кажется фильтровать в шаблоне неверно, это нарушение MVC. Другими словами выборку нужно делать в view.
vipfirms = Firma.objects.all()
return render_to_response('index.html', {'vipfirms': vipfirms, }, context_instance=RequestContext(request, ))
{% for f in vipfirms %}
Фирма: {{ f.brand }} имеет
Положительных: {{ f.otzyv_set.filter(mark=1)|length }} отзывов
Отрицательных: {{ f.otzyv_set.filter(mark=2)|length }} отзывов
Офлайн
Во вьюшке:
vipfirms = Firma.objects.extra(
select={
'positive_count': 'SELECT COUNT(*) FROM "название таблицы Otzyv" WHERE "название таблицы Otzyv".firma_id = "название таблицы Firma".id and "название таблицы Otzyv".mark = 1',
'negative_count': 'SELECT COUNT(*) FROM "название таблицы Otzyv" WHERE "название таблицы Otzyv".firma_id = "название таблицы Firma".id and "название таблицы Otzyv".mark = 2'
},
)
{% for f in vipfirms %}
Фирма: {{ f.brand }} имеет
Положительных: {{ f.positive_count }} отзывов
Отрицательных: {{ f.negative_count }} отзывов
Офлайн
О, если я правильно понял, то можно использовать вот это.
Офлайн
Мне кажется использование raw-sql - плохая практика в данном случае.
Офлайн
AlexKiriukhaПравильно поняли. Только не уверен выйдет ли выбрать количество “положительных” и “отрицательных” одновременно в одном запросе. =)
О, если я правильно понял, то можно использовать вот это.
Офлайн
lizzardКак будет выглядеть хорошая практика в данном случае? Покажите альтернативу? =)
Мне кажется использование raw-sql - плохая практика в данном случае.
Офлайн
в одном запросе не получится
from django.db.models import Count
m1=model.objects.filter(mark=1).aggregate(Count('id'))
m2=model.objects.filter(mark=2).aggregate(Count('id'))
mark_1 = m1['id__count']
mark_2 = m2['id__count']
Отредактировано (Ноя. 15, 2010 14:52:41)
Офлайн
sonniyЧитаем внимательно условия задачи:
в одном запросе не получитсяfrom django.db.models import Count
m1=model.objects.filter(mark=1).aggregate(Count('id'))
m2=model.objects.filter(mark=2).aggregate(Count('id'))
mark_1 = m1['id__count']
mark_2 = m2['id__count']
“Есть модель Firma (модель описывающая фирму)…А вы просто агрегировали количесто елементов по Mark, принимая что поле Mark находится в той же модели, что совсем не так.
Есть еще модели Otzyv (отзывы о фирмах, в них поле Mark=1 -положительный отзыв, Mark=2 - отрицат.)…
…мне нужно вывести список этих фирм, и к КАЖДОЙ написать, имеется столько-то положительных и столько-то отрицательных,
то есть на ходу сосчитать сколько привязано Otzyv к каждой фирме, но с учетом поля Mark…”
Офлайн