Django models 如何按字母顺序排列多对多字段?

Django models 如何按字母顺序排列多对多字段?,django-models,django-forms,django-2.1,Django Models,Django Forms,Django 2.1,我有一个在models.py中定义的对象播放列表: class Playlist(models.Model): """Allow a user to create a customized list of songs.""" name = models.CharField(max_length=100) image = models.ImageField(upload_to='playlists/%Y/%m/%d', blank=True, null=True)

我有一个在models.py中定义的对象播放列表:

class Playlist(models.Model):
    """Allow a user to create a customized list of songs."""
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to='playlists/%Y/%m/%d', blank=True, null=True)
    songs = models.ManyToManyField('Song')
    description = models.TextField(blank=True, null=True, max_length=1000)
    date_added = models.DateTimeField(auto_now_add=True)

def __str__(self):
    """String for representing the model object."""
    return self.name

def get_absolute_url(self):
    """Returns the url to access a detail record for this song."""
    return reverse('playlist-detail', args=[str(self.id)])
我还有表单AddNewPlaylist,它继承了此模型:

class AddPlaylistForm(forms.ModelForm):

    class Meta:
        model = Playlist
        fields = ['name', 'image', 'description', 'songs']
我只希望表单中的“songs”对象按其在表单中出现的字母顺序排列-我如何才能做到这一点


编辑:我不想更改数据库中
歌曲
模型的顺序-只想更改它在AddPlayList表单中的顺序。

因此,我假设在
models.py
中,您有一个名为
歌曲
的模型。在
Song
模型中,我假设您有一个字段
Song\u name
,或者类似的内容。在歌曲中,添加:

class Meta:
    ordering = ('song_name',)
这将按名称的字母顺序排列
歌曲
对象的所有查询集,包括播放列表的
多个
实例

如果您想特别订购
manytomy
而不是所有歌曲查询集,那么您应该通过
模型创建一个
,如下所示:

class PlaylistSong(models.Model):
    playlist = models.ForeignKey(Playlist, on_delete=models.CASCADE)
    song = models.ForeignKey(Song, on_delete=models.PROTECT)

    class Meta:
        ordering = ('song__song_name',)
然后,您可以将
播放列表
中的
歌曲
字段替换为:

songs = models.ManyToManyField(Song, through='PlaylistSong', blank=True)

对不起,我应该指定:我不想更改
歌曲
模型在数据库中的排序方式-仅当它在表单中呈现时。然后您应该使用直通模型,并在直通模型上定义
排序
,我不熟悉直通模型-您可以指定如何执行此操作吗?抱歉-这是一个新问题。刚刚更新了我的答案。基本上,您所做的是创建一个模型,该模型间接连接
播放列表
歌曲
模型。因此,对于播放列表中的每首歌曲,您在
playlishong
表中都有一个条目来跟踪它。然后,此模型按字母顺序排序,排序方式为
song\u name
@Leaozinho让我知道它是否有效,或者您是否仍有问题