【问题标题】:How to alphabetically order a many-to-many field?如何按字母顺序排列多对多字段?
【发布时间】:2019-01-18 22:43:58
【问题描述】:

我有一个在 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']

我只希望表单中的“歌曲”对​​象按其出现在表单中的字母顺序排列 - 我该怎么做?

编辑:我不想更改数据库中 song 模型的顺序 - 只是它在 AddPlayList 表单中的排序方式。

【问题讨论】:

    标签: django-models django-forms django-2.1


    【解决方案1】:

    所以,我假设在您的 models.py 中,您有一个名为 Song 的模型。在Song 模型中,我假设您有一个字段song_name,或类似的东西。在Song,添加:

    class Meta:
        ordering = ('song_name',)
    

    这将按名称的字母顺序排列所有 Song 对象的查询集,包括播放列表的 manytomany 实例。

    如果您想专门订购 manytomany 而不是所有 Song 查询集,那么您应该创建一个 through 模型,如下所示:

    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',)
    

    然后您可以将Playlist 中的songs 字段替换为:

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

    【讨论】:

    • 抱歉,我应该指定:我不想更改 Song 模型在数据库中的排序方式 - 只是因为它在表单中呈现。
    • 那么您应该使用直通模型,并在直通模型上定义ordering
    • 我不熟悉通过模型 - 你能指定如何做到这一点?抱歉 - 对此非常陌生。
    • 刚刚更新了我的答案。本质上,您所做的是创建一个模型,该模型间接连接 PlaylistSong 模型。因此,对于播放列表中的每首歌曲,您在 PlaylistSong 表中都有一个条目来跟踪它。然后这个模型按song_name 的字母顺序排序。
    • @Leaozinho 让我知道它是否有效或您是否仍有问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多