Как получить количество объектов на auth.user?

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

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_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 ответ

Решение

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

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

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

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

Другие вопросы по тегам