如何按字母顺序排列多对多字段?
How to alphabetically order a many-to-many field?
我有一个在 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' 对象按其在表单中出现的字母顺序排序 - 我该怎么做?
编辑:我不想更改 song
模型在数据库中的排序 - 只想更改它在 AddPlayList 表单中的排序方式。
因此,我假设在您的 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)
我有一个在 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' 对象按其在表单中出现的字母顺序排序 - 我该怎么做?
编辑:我不想更改 song
模型在数据库中的排序 - 只想更改它在 AddPlayList 表单中的排序方式。
因此,我假设在您的 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)