Как упорядочить поле «многие ко многим» в алфавитном порядке? - PullRequest
0 голосов
/ 19 января 2019

У меня есть объект Playlist, который определен в 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' в форме был упорядочен в алфавитном порядке, как это выглядит в форме - как я могу это сделать?

РЕДАКТИРОВАТЬ: я не хочу изменять порядок модели song в базе данных - только способ, которым она упорядочена в форме AddPlayList.

1 Ответ

0 голосов
/ 19 января 2019

Итак, я предполагаю, что в вашем 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',)

Затем можно заменить поле songs в Playlist на:

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