2009-10-28 1 views
1

У меня есть модель проекта, аналогичная:Как получить количество объектов на auth.user?

class Project(models.Model): 
    ... 
    lead_analyst=models.ForeignKey(User, related_name='lead_analyst') 
    ... 

Я хочу использовать агрегацию Джанго, чтобы вернуть все пользователь с числом проектов для каждого пользователя. Что-то вроде:

models.User.objects.annotate(project_count=Count('project_set')) 

Только это не работает, потому что auth.user не имеет знания о моем классе Project. Я получаю ошибку:

Cannot resolve keyword 'project_set' into field. Choices are: date_joined, email, employee, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, lead_analyst, logentry, message, password, siteprofile, submitter, user_permissions, username

Две части вопроса, на самом деле:

  1. Как получить этот счетчик проектов на auth.user

  2. Есть ли лучший способ, чтобы написать ассоциацию между моим Класс проекта и класс auth.user, который сделает эту агрегацию жизнеспособной?

Или я должен просто вломиться в необработанный sql для агрегации (либо через raw sql в django, либо в виде базы данных)?

ответ

4

Ничего плохого в ваших моделях - это точно, как установить это отношение. Проблема заключается только в том, что вы указали related_name во внешнем ключе, так что, насколько это касается Пользователя, нет project_set - вместо этого есть lead_analyst. Фактически вы можете увидеть это в списке полей, заданных вашим сообщением об ошибке.

Таким образом, ваш совокупный запрос должен прочитать:

models.User.objects.annotate(project_count=Count('lead_analyst')) 

(я должен сказать, я думаю, что вы выбрали неверное родственное имя здесь - вы бы лучше придерживаться по умолчанию, в этом случае оригинала синтаксис бы сработал.)

+0

Ну, я идиот фрикки ... :-) Причина для связанного_имя заключается в том, что у меня есть несколько полей, относящихся к Пользователю в этой модели. Я просто не отобразил их в своем фрагменте выше. Спасибо за помощь. – cethegeek