Django необработанный запрос от многих ко многим
Я работаю с набором данных плейлистов Spotify в Django. У меня есть следующие модели.
class Artist(models.Model):
uri = models.CharField(max_length=255)
name = models.CharField(max_length=255)
class Track(models.Model):
uri = models.CharField(max_length=255)=
name = models.CharField(max_length=255)
artist = models.ManyToManyField(Artist)
duration_ms = models.IntegerField()
class Playlist(models.Model):
pid = models.IntegerField()
name = models.CharField(max_length=255)
collaborative = models.BooleanField(default=False)
tracks = models.ManyToManyField(Track)
num_followers = models.IntegerField()
Django создал сквозную модель для playlist_tracks с полями:
class playlist_tracks(models.Model):
id = models.IntegerField()
playlist_id = models.IntegerField()
track_id = models.IntegerField()
У меня есть раздел в шаблоне детализации трека, где я хотел бы дать рекомендации для других треков.
Пройдитесь по каждому списку воспроизведения и сделайте запись, которая суммирует все остальные треки в этом списке воспроизведения. Если этот трек появляется в следующем списке воспроизведения, увеличьте счетчик, в противном случае добавьте его в таблицу. После завершения цикла упорядочьте по убыванию и ограничьте до 10.
Этот SQL-запрос делает то, что я хочу, в программе просмотра SQLite, однако я не могу понять, каким должен быть синтаксис django для написания этого запроса.
SELECT *, count(track_id) as num_occurences
FROM spotify_playlist_tracks
WHERE playlist_id in (
SELECT playlist_id
FROM spotify_playlist_tracks
WHERE track_id = 26(***arbitrary pk)
)
GROUP BY track_id
ORDER BY num_occurences DESC
LIMIT 10
Включение его в качестве метода модели на модели путей делает то, что я хотел бы, но я хотел бы очистить его и вызвать запрос с помощью Django ORM должным образом.
def get_related_tracks(self):
rl = Track.objects.raw('SELECT *, count(track_id) as num_occurences
FROM spotify_playlist_tracks
WHERE playlist_id in(
SELECT playlist_id
FROM spotify_playlist_tracks
WHERE track_id = {})
GROUP BY track_id
ORDER BY num_occurences
DESC LIMIT 10'.format(self.pk))
return(rl)