带有分组的Django后续StringAgg

问题描述

我将 Django 与 postgresql 一起使用。我有 3 个具有 m2m 关系的表:moviesgenrespersons。每个人都可以扮演自己的演员、作家或导演角色。

title    |genre_name|role  |name          |
---------|----------|------|--------------|
Dark Star|Sci-Fi    |Actor |Brian Narelle |
Dark Star|Sci-Fi    |Writer|John Carpenter|
Dark Star|Sci-Fi    |Writer|Dan O'Bannon  |
Dark Star|Sci-Fi    |Actor |Cal Kuniholm  |
Dark Star|Comedy    |Actor |Brian Narelle |
Dark Star|Comedy    |Writer|Dan O'Bannon  |
Dark Star|Comedy    |Actor |Cal Kuniholm  |

我想要达到的内容按流派和人物姓名以及每部电影的串联姓名字段分组:

title    |genres        |role  |names                                  |
---------|--------------|------|---------------------------------------|
Dark Star|Comedy,Sci-Fi|Actor |Brian Narelle,Cal Kuniholm,Dre Pahich|
Dark Star|Comedy,Sci-Fi|Writer|Dan O'Bannon,John Carpenter           |

使用原始 sql 很容易访问后续的组和 string_agg查询

select distinct tt.title,tt.genres,tt.role,string_agg(tt.name,',') as names
from (
    select t.title,string_agg(t.genre_name,' ORDER BY t.genre_name) as genres,t.role,t.name
    from (
        SELECT "movies_filmwork"."title","movies_genre"."name" as "genre_name","movies_person"."role","movies_person"."name"
          FROM "movies_filmwork"
          LEFT OUTER JOIN "movies_filmwork_genres"
            ON ("movies_filmwork"."id" = "movies_filmwork_genres"."filmwork_id")
          LEFT OUTER JOIN "movies_genre"
            ON ("movies_filmwork_genres"."genre_id" = "movies_genre"."id")
          LEFT OUTER JOIN "movies_filmwork_persons"
            ON ("movies_filmwork"."id" = "movies_filmwork_persons"."filmwork_id")
          LEFT OUTER JOIN "movies_person"
            ON ("movies_filmwork_persons"."person_id" = "movies_person"."id")
        where "movies_filmwork"."title" = 'Dark Star'
     ) t
     group by t.title,t.name
 ) tt
 group by tt.title,tt.genres
 order by tt.title,genres
;

但我无法在 django orm 中得出相同的结果。最近的方法

Filmwork.objects.filter(title='Dark Star')
.values('title','persons__role','persons__name')
.annotate(genress=StringAgg('genres__name',delimiter=',ordering='genres__name'))

为我提供了每部电影的串联类型,但人员仍然未分组:

title    |genres        |role  |name          |
---------|--------------|------|--------------|
Dark Star|Comedy,Sci-Fi|Actor |Brian Narelle |
Dark Star|Comedy,Sci-Fi|Actor |Cal Kuniholm  |
Dark Star|Comedy,Sci-Fi|Actor |Dre Pahich    |
Dark Star|Comedy,Sci-Fi|Writer|Dan O'Bannon  |
Dark Star|Comedy,Sci-Fi|Writer|John Carpenter|

最好的方法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)