Как настроить модель 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 мне здесь не поможет, и я могу легко подделать объект модели самостоятельно с помощью результатов запроса, но если есть трюк, который я упускаю, я был бы признателен, если бы узнал о нем.

Вернуться на верх