问题描述
我有一个应用程序,可以在不同的Musicstation上存储播放的音乐。我的模型如下:
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)
Track模型是由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,4)
select
playlist_logtrack.track_id,count(playlist_logtrack.track_id) as playcount,json_group_played_per_station from
playlist_playlistitem p1
left join playlist_logtrack on p1.log_track_id = playlist_logtrack.id
left join (
select
track_id,group_concat(json_played_per_station) as json_group_played_per_station,count(json_played_per_station) as station_count
from
(select
track_id,concat('{"id":"',track_id,'","station":"',station_id,"play_count":"',count(log_track_id),'"}') as json_played_per_station
from playlist_playlistitem
left join playlist_logtrack on playlist_playlistitem.log_track_id = playlist_logtrack.id
where (played_at between '2020-10-14' and '2020-10-16') and station_id in (91,2)
group by playlist_logtrack.track_id,station_id) as played_per_station
group by track_id) as compare_with
on compare_with.track_id = playlist_logtrack.track_id
left join playlist_track on (playlist_logtrack.track_id = playlist_track.id)
where
p1.station_id = 2 and
p1.played_at between '2020-10-14' and '2020-10-27'
group by playlist_logtrack.track_id;
我无法将其导入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',Count('played_at')
)
).values('played_per_track_and_station')
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)