Как получить количество объектов на 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, имя пользователя
Вопрос из двух частей:
Как получить это количество проектов за
auth.user
Есть ли лучший способ написать связь между моим классом Project и
auth.user
класс, который сделает эту агрегацию жизнеспособной?
Или я должен просто взломать raw sql для агрегации (либо через raw sql в django, либо через представление в базе данных)?
1 ответ
Ничего плохого в ваших моделях - это именно то, как установить это отношение. Проблема в том, что вы указали related_name
в иностранном ключе, так что в отношении пользователя, нет project_set
- есть lead_analyst
вместо. Фактически вы можете увидеть это в списке полей, указанных в сообщении об ошибке.
Таким образом, ваш сводный запрос должен выглядеть так:
models.User.objects.annotate(project_count=Count('lead_analyst'))
(Должен сказать, я думаю, что вы выбрали здесь вводящее в заблуждение связанное имя - вам лучше придерживаться значения по умолчанию, и в этом случае ваш оригинальный синтаксис сработает.)