Лучший способ сделать простой плейлист в django - PullRequest
2 голосов
/ 26 января 2011

простой вопрос о Джанго:

У меня есть довольно классический пример списка воспроизведения и моделей треков:

class Track(models.Model):
    name = models.CharField(max_length = 50)
    mp3 =  models.FileField(upload_to="track/")

class Playlist(models.Model):
    name = models.CharField(max_length = 50)

class PlaylistTrack(models.Model):
    playlist = models.ForeignKey('track.Playlist')
    track =    models.ForeignKey('track.Track')
    position = models.IntegerField() #Here's the crux of the problem

Это лучший способ создать плейлист, который можно заказать?

Я сомневаюсь в этом, но если так, как мне получить заказанный QuerySet? (Я буду сериализовать в json, поэтому предпочтение отдается QuerySet, но если у вас есть другой, простой способ создания json, я бы с удовольствием это услышал!)

Вот что у меня есть:

playlist = Track.objects.filter(playlisttrack__playlist__exact=1)

Но это не сохраняет порядок, согласно полю PlaylistTrack.position ...

Спасибо!

Ответы [ 2 ]

5 голосов
/ 26 января 2011

Если вы заметите, что ваша модель PlaylistTrack является не чем иным, как промежуточной таблицей Many-2-Many, то все станет более очевидным (отметьте this ):

class Playlist(models.Model):
    name = models.CharField(max_length = 50)
    tracks = models.ManyToManyField('Track', through='PlaylistTrack')

class PlaylistTrack(models.Model):
    playlist = models.ForeignKey('track.Playlist')
    track =    models.ForeignKey('track.Track')
    position = models.IntegerField() #Here's the crux of the problem

    class Meta:
        ordering = ['position']

Теперь вы можете просто:

my_playlist.tracks.all()
2 голосов
/ 26 января 2011

Если вы беспокоитесь о своем порядке, просто добавьте предложение order_by в конец запроса.

playlist = Track.objects.filter(playlisttrack__playlist__exact=1).order_by('+playlisttrack__position')

Чтобы вывести результирующий набор в json просто:

json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(playlist, ensure_ascii=False, stream=response)
...