2015-03-13 114 views
0

假設我有以下型號:order_with_respect_to反向關係

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

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

所以播放列表可以有多個歌曲和一首歌曲可以在多個播放列表。

我想添加一個「訂單」字段,以便用戶可以重新排列播放列表中的歌曲。我發現order_with_respect_to,這似乎是一個完美的解決方案。不過,我需要的是元選項添加到Song模型,例如:

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

    class Meta: 
     order_with_respect_to = 'playlists' 

顯然,有宋以來指定我得在播放列表模型中指定的關係沒有播放領域。有沒有辦法使用related_name來指定order_with_respect_to的反向關係?或者我可以在Song模型中使用對播放列表的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() 

因此,要獲得在PlaylistSongs按照正確的順序,你會做這樣的事情:

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

終於回來到這個項目中。這工作完美,謝謝! – Banjer 2015-06-12 11:51:28