Как настроить модель Django на согласованное представление postgres?
Django 4.2.9, postgres 15.2 (сервер), Python 3.10
У меня есть представление, которое делает свою собственную агрегацию, и я хочу отобразить его в Django Model.
CREATE VIEW report_usage AS
SELECT t.team_id, t.display_name, t.report_allowance, count(r.*) as "monthly_usage"
FROM report r
LEFT JOIN teams t ON t.team_id = r.team_id
WHERE date_trunc('month', r.response_ts) = date_trunc('month', now())
GROUP BY t.team_id, t.display_name, report_allowance;
Это представление работает, как и было обещано; оно подсчитывает количество отчетов, запущенных каждой командой. Теперь это представление используется и в других местах, поэтому я хочу просто включить его в модель Django для использования в моем приложении.
Поэтому я построил вокруг него Django-модель:
class ReportUsage(models.Model):
class Meta:
managed = False
verbose_name_plural = 'Report Usage'
db_table = 'report_usage'
# Not really a key for this table.. just needed by django
team_id = models.IntegerField(primary_key=True, db_column='team_id')
display_name = models.CharField(db_column='display_name')
report_allowance = models.IntegerField(db_column='report_allowance')
report_usage = models.IntegerField(db_column='count')
Как бы то ни было
Не работает:
django.db.utils.ProgrammingError: столбец "report_usage.team_id" должен присутствовать в предложении GROUP BY или использоваться в агрегатной функции LINE 1: SELECT "report_usage". "team_id", "report_usage". "display_n...
Это не имеет для меня никакого смысла. Можно предположить, что Джанго увидел функцию count() и решил взять ее на себя.
Я прочитал все, что смог найти здесь, но этот случай кажется уникальным, потому что мне нужно, чтобы Django обращался с представлением как с таблицей и просто отображал поля (с возможностью только чтения я разберусь позже).
Я подозреваю, что Django мне здесь не поможет, и я могу легко подделать объект модели самостоятельно с помощью результатов запроса, но если есть трюк, который я упускаю, я был бы признателен, если бы узнал о нем.