Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2012 15:28:52

Gorazio
От:
Зарегистрирован: 2011-11-20
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка из базы

Следуя совету FishHook'a, количество студентов в каждой группе достаю с помощью annotate (для сокращения количества запросов к базе). И вроди бы все заработало. Но приклеив к проэкту middleware, которое считает эти самые запросы, я обнаружил, что эта вьюха обращается к базе 7 раз (групп всего 3). Подскажите пожалуйста где я налажал, и если не трудно покажите как правильно.

def grups(request):
grall = Groups.objects.all()
html = "<html>\n<body>\n<table border=""1"">\n<th>Группа</th><th>Количество человек</th><th>Староста</th>"
q = Students.objects.values('group').annotate(Count('id'))
for i, g in enumerate(grall):
try:
kol = q[i]['id__count']
except:
kol = 0
html += "<tr><td><a href=""/grupctn/?id=%s> %s </a></td><td> %s </td><td> %s </td></tr>\n" % (g.id, g, kol, g.starosta or 'Не назначено')
html += "</table>\n<a href=""/group/"">Добавить группу...</a>\n</body></html>"
return HttpResponse(html)
Наперед спасибо.



Офлайн

#2 Янв. 20, 2012 16:40:22

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Выборка из базы

class Group(models.Model):
name = models.CharField(max_length=25)
starosta = models.OneToOneField('Student', blank=True, null=True, related_name='group_st')


class Student(models.Model):
fio = models.CharField(max_length=50)
group = models.ForeignKey('Group', blank=True, null=True, related_name='students')
>>> for g in Group.objects.select_related('starosta').annotate(num_students=models.Count('students')).all():
... print g.name, g.starosta.fio, g.num_students
...
1 qwe 2
2 zxc 1
3 345 3
>>> from django.db import connection
>>> connection.queries
[{'time': '0.001', 'sql': u'SELECT "test_app_group"."id", "test_app_group"."name", "test_app_group"."starosta_id", COUNT(T3."id") AS "num_students", "test_app_student"."id", "test_app_student"."fio", "test_app_student"."group_id" FROM "test_app_group" LEFT OUTER JOIN "test_app_student" ON ("test_app_group"."starosta_id" = "test_app_student"."id") LEFT OUTER JOIN "test_app_student" T3 ON ("test_app_group"."id" = T3."group_id") GROUP BY "test_app_group"."id", "test_app_group"."name", "test_app_group"."starosta_id", "test_app_group"."id", "test_app_group"."name", "test_app_group"."starosta_id", "test_app_student"."id", "test_app_student"."fio", "test_app_student"."group_id"'}]
>>>



Офлайн

#3 Янв. 20, 2012 20:29:08

Gorazio
От:
Зарегистрирован: 2011-11-20
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка из базы

Ура! Спасибо Svas, я бесконечно вам благодарен!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version