Как получить количество объектов на auth.user? - PullRequest
1 голос
/ 28 октября 2009

У меня есть модель проекта, похожая на:

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

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

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

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

Невозможно разрешить ключевое слово project_set в поле. Возможные варианты: date_joined, электронная почта, сотрудник, имя, имя, группы, id, is_active, is_staff, is_superuser, last_login, last_name, lead_analyst, logentry, сообщение, пароль, siteprofile, отправитель, user_permissions, имя пользователя

Вопрос из двух частей, действительно:

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

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

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

1 Ответ

4 голосов
/ 28 октября 2009

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

Итак, ваш сводный запрос должен выглядеть так:

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

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

...