Mysql 如何在Django中对子查询使用GroupConcat
我有一个应用程序在不同的音乐场景中存储播放的音乐。我的模型如下所示:Mysql 如何在Django中对子查询使用GroupConcat,mysql,django,orm,group-concat,Mysql,Django,Orm,Group Concat,我有一个应用程序在不同的音乐场景中存储播放的音乐。我的模型如下所示: class PlaylistItem(models.Model): played_at = models.DateTimeField(_('played at')) station = models.ForeignKey(Station, on_delete=models.CASCADE) log_track = models.ForeignKey('LogTrack', on_delete=model
class PlaylistItem(models.Model):
played_at = models.DateTimeField(_('played at'))
station = models.ForeignKey(Station, on_delete=models.CASCADE)
log_track = models.ForeignKey('LogTrack', on_delete=models.CASCADE)
class LogTrack(UpdateInfo):
track = models.ForeignKey(Track, on_delete=models.CASCADE, blank=True, null=True)
class Track(UpdateInfo):
artist = models.CharField(_('artist'), max_length=150)
tracktitle = models.CharField(_('tracktitle'), max_length=150)
曲目模型是一个由LogTrack歌曲的标准化名称组成的模型
我想要的是一段时间内不同电台(匹配主站)之间重叠歌曲的概述。我想知道这首歌在不同的电台播放了多少次,按主站的顺序排列,还有这首歌在多少电台播放过(按降序排列)。
这个想法是:
我想到这样的输出:
Master Station | Station B | Station C
-----------------------------------------
Track 1 (5 plays) | 8 plays | 3 plays
Track 2 (2 plays) | No | 5 plays
Track 3 (2 plays) | No | No
或作为数据库输出:
track_id | station__count | groupconcat(track, station, play_count)
-------------------------------------------------------------------
1 | 2 | (1, 22, 3), (1, 29, 5)
2 | 1 | (2, 29, 4)
在MySQL中,我有一个查询(可能过于复杂):
我没法把这个输入Django ORM。到目前为止我有。但是,当我在子查询中使用它时,我不知怎么地迷路了
PlaylistItem.objects.filter(
played_at__gte=datetime(2020,11,2,10),
station_id__in=[22,29]
).values('log_track__track_id', 'station_id').annotate(
played_per_track_and_station=Concat(
'log_track__track_id',
Value('-'),
'station_id',
Value('-'),
Count('played_at')
)
).values('played_per_track_and_station')
PlaylistItem.objects.filter(
played_at__gte=datetime(2020,11,2,10),
station_id__in=[22,29]
).values('log_track__track_id', 'station_id').annotate(
played_per_track_and_station=Concat(
'log_track__track_id',
Value('-'),
'station_id',
Value('-'),
Count('played_at')
)
).values('played_per_track_and_station')