2015-03-13 5 views
0

Предположим, у меня есть следующие модели:order_with_respect_to для обратной связи

class Playlist(models.Model): 
    name = models.TextField()  
    songs = models.ManyToManyField(Song) 

class Song(models.Model): 
    title = models.TextField() 

Так Playlist может иметь несколько песен и песня может быть в несколько списков воспроизведения.

Я хочу добавить поле «заказ», чтобы пользователь мог изменить порядок песен в списке воспроизведения. Я нашел order_with_respect_to, что кажется идеальным решением. Тем не менее, я должен был бы добавить, что мета вариант для Song модели, например .:

class Song(models.Model): 
    title = models.TextField() 

    class Meta: 
     order_with_respect_to = 'playlists' 

Очевидно, что нет поля списка воспроизведения указано на песни, так как у меня есть отношения, указанные в модели списка воспроизведения. Есть ли способ указать обратную связь для order_with_respect_to с использованием related_name? Или я могу пощекотать ссылку на плейлисты в модели Песни ForeignKey?

ответ

1

order_with_respect_to (возможно) полезно, если у вас есть ForeignKey, но не ManyToManyField. Он работает, добавляя дополнительное поле к модели, но в вашем случае порядок зависит от Playlist.

Простой способ сделать это в Django - это разместить заказ на явно созданной таблице through.

class Playlist(models.Model): 
    name = models.TextField() 
    songs = models.ManyToManyField(Song, through='PlaylistSong') 

class Song(models.Model): 
    title = models.TextField() 

class PlaylistSong(models.Model): 
    playlist = models.ForeignKey(Playlist) 
    song = models.ForeignKey(Song) 
    order = models.PositiveSmallIntegerField() 

Так, чтобы получить Songs в Playlist в правильном порядке, вы могли бы сделать что-то вроде:

Song.objects.filter(playlistsong__playlist_id=1) 
      .order_by('playlistsong__order') 
+0

Наконец вернулся к этому проекту. Это отлично работает, спасибо! – Banjer

Смежные вопросы