I have to following models:
class Song(models.Model):
(...)
class Playlist(models.Model):
(...)
songs = models.ManyToManyField(
Song,
through="PlaylistSong",
through_fields=("playlist", "song"),
)
class PlaylistSong(models.Model):
playlist = models.ForeignKey(Playlist, on_delete=models.CASCADE)
song = models.ForeignKey(Song, on_delete=models.CASCADE)
(...)
order = models.IntegerField(default=0)
When the user selects an Playlist
I want to return the songs from that playlist, but I can’t order the songs because the order
field is in the Album
, not Playlist
:
playlist = Playlist.objects.get(id=pk).songs.order_by("order")
This make sense, but what I can’t figure out is, given I have the playlist and therefore the objects of PlaylistSong
, how can I order them by the field PlaylistSong.order
?
I have found a way, which is:
playlist = Playlist.objects.get(id=pk)
playlist_songs = PlaylistSongs.objects.filter(playlist=playlist).order_by("order")
But this won’t return songs
I would have to iterate another time the object playlist_songs
to then find the songs:
playlist = Playlist.objects.get(id=pk)
playlist_songs = PlaylistSongs.objects.filter(playlist=playlist).order_by("order")
songs = [playlist_songs.song for playlist_song in playlist_songs ]
Is there a way to avoid that much iteration when using order_by
in ManyToManyFields
?