Как сделать правильный групповой запрос в Django - PullRequest
0 голосов
/ 08 марта 2012

У меня есть таблица с несколькими идентификаторами отслеживания. Я пытаюсь сгруппировать все идентификаторы отслеживания и получить их счет.

Вот как будет выглядеть SQL-запрос:

SELECT tracking_id, COUNT( * ) 
FROM tracking
GROUP BY tracking_id

Я думаю, что нашел правильный способ сделать это в django, но я что-то упустил и в настоящее время получаю сообщение об ошибке Exception Value: 'dict' object has no attribute 'tracking_id'

Вот как выглядит мой взгляд:

def stats(request):

    users = Tracking.objects.values('tracking_id').annotate(dcount=Count('tracking_id'))

    stats = []
    for user in users:
        stats.append((user.tracking_id, user.dcount))

    return render_to_response('tracking/stats.html', { 'stats': stats, })

Любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Как насчет (частично вдохновленный ответом @ second):

users = Tracking.objects.values( 'tracking_id' ).annotate(dcount=Count('tracking_id'))

, а затем

for user in users:
    stats.append((user[ 'tracking_id' ], user[ 'dcount' ]))    

?

0 голосов
/ 08 марта 2012

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

./manage.py shell открывает оболочку python с кодом вашего проекта в системном пути

>>> from myapp.models import Tracking
>>> from django.db.models import Count
>>> Tracking.objects.values('tracking_id').annotate(dcount=Count('tracking_id'))

[{'tracking_id': 53, 'dcount': 12}, {'tracking_id': 1, 'dcount': 32}, ...]

это позволяет вам увидеть формат возвращаемых данных и получить вас на вашем пути

в качестве альтернативы, вы можете добавить оператор pdb (python debugger) в код вашего представления (при условии, что runserver обслуживает ваш код) и загрузить страницу. когда достигнут оператор pdb, ваш сервер остановится и поместит вас в оболочку отладчика, прямо в контексте вашего представления

def view(request):
    [...]
    import pdb; pdb.set_trace  # or even better, pip install ipdb and use instead

    return "foo"
...