我如何在Django订购一个ManyToManyField并将其按顺序发货?

我如何在Django订购一个ManyToManyField并将其按顺序发货?,django,python-2.7,Django,Python 2.7,我有很多歌曲的播放列表,我希望当我从queryset中获得这些歌曲时,这些歌曲保持有序。我已经尝试了一个显而易见的方法-一个带有order_by='song_order'的'through'模型,但这不起作用,并且尝试在song上使用代理模型使其起作用。请参见下面的代码,最终抛出此错误: AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache' 目前,它看起来是这样的: class S

我有很多歌曲的播放列表,我希望当我从queryset中获得这些歌曲时,这些歌曲保持有序。我已经尝试了一个显而易见的方法-一个带有order_by='song_order'的'through'模型,但这不起作用,并且尝试在song上使用代理模型使其起作用。请参见下面的代码,最终抛出此错误:

AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache'
目前,它看起来是这样的:

class Song(models.Model):
    sid = models.AutoField(primary_key=True)
    id = models.CharField(max_length=60)
    title = models.CharField(max_length=300)
    artist_name = models.CharField(max_length=250)
    artist_id = models.CharField(max_length=50)
    mood = models.ForeignKey('Mood', related_name='songs_with_mood', blank=True, null=True)

    def __unicode__ (self):
        return "%s - %s" % (self.title, self.id)


class PlaylistSong(Song):
    class Meta:
        proxy = True
        ordering = ['playlist_song_ordering__song_order']
         # ^ this is the line responsible for the Attribute Error

class PlaylistSongs(models.Model):
    song = models.ForeignKey("PlaylistSong", related_name='playlist_song_ordering')
    playlist = models.ForeignKey("Playlist")
    song_order = models.IntegerField()

    class Meta:
        db_table = "api_playlist_songs"
        ordering = ['song_order']

class Playlist(models.Model):
    owner = models.ForeignKey('UserProfile', related_name='owned_playlists')
    title = models.CharField(max_length=70)
    songs = models.ManyToManyField('Song', related_name='in_playlists', through='PlaylistSongs')
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-created',)
        unique_together = ("owner", "title", "created",)

我不确定代理模型在这里应该做什么。你提到的最明显的一点是正确的答案:你应该确切地说明为什么它不起作用,以及当你尝试时发生了什么。代理模型应该给我一种方法,按照歌曲的顺序对播放歌曲的查询集进行排序,我认为这是必要的,因为我似乎无法获得playlist.songs.all以歌曲的顺序进行排序,并且认为通过代理模型中的某种东西进行排序可以通过这种方式进行访问。但我最终放弃了代理模型,只是手动创建查询集-playlist.songs.order_by'playlist_song_ordering_song_ordering_song_order'-效果很好。谢谢你催我这么做!