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)
Вернуться на верх