2015-03-13 111 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