Django Admin - как отобразить значения поля ManyToManyField

Я хочу отобразить связанные жанры музыкального альбома в моей админке Django, но я не уверен, как должен выглядеть мой запрос:

Это моя модель альбомов:

class MusicAlbums(models.Model):
    objects = RandomManager()
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.TextField(verbose_name=_("Title"), blank=False, null=True, editable=False, max_length=255)
    artist = models.ForeignKey(MusicArtists, on_delete=models.CASCADE, related_name='artist_relation')
    album_artist = models.ForeignKey(MusicArtists, on_delete=models.CASCADE, related_name='album_artist_relation')
    cover = models.ImageField(verbose_name=_("Cover"), blank=True, null=True, upload_to=get_file_path_images)
    cover_tn = models.ImageField(verbose_name=_("Cover Thumbnail"), blank=True, null=True, upload_to=get_file_path_images)
    release_date = models.DateField(verbose_name=_("Release Date"), blank=True, null=True, editable=False)
    genre_relation = models.ManyToManyField(through='GenreMusicAlbum', to='Genre')
    total_discs = models.IntegerField(verbose_name=_("Total Discs #"), blank=True, null=True,)
    total_tracks = models.IntegerField(verbose_name=_("Total Tracks #"), blank=True, null=True,)
    copyright = models.TextField(verbose_name=_("Copyright"), blank=True, null=True, editable=False, max_length=255)
    date_added = models.DateTimeField(auto_now_add=True, blank=True, verbose_name=_("Date Added"))

Мой вспомогательный класс для склеивания Genre вместе с GenreMusicAlbum:

class GenreMusicAlbum(models.Model):
    music_album = models.ForeignKey(MusicAlbums, on_delete=models.CASCADE, blank=True)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE, blank=False, null=False)

И наконец, моя модель жанра:

class Genre(models.Model):
    objects = RandomManager()
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(verbose_name=_("Genre"), blank=True, null=True, editable=False, unique=True, max_length=50)

Пока все хорошо. Теперь я начал вставлять все это в Django admin

class MusicAlbumsAdmin(admin.ModelAdmin):
    list_display = ['title', 'get_artist', 'get_album_artist', 'release_date', 'date_added']
    ordering = ['title']
    list_filter = ['title']
    readonly_fields = ('get_artist', 'get_album_artist', 'cover',
                       'cover_tn', 'release_date', 'get_album_genre', 'total_discs',
                       'total_tracks')
    exclude = ('artist', 'album_artist', 'genre_relation')
    list_per_page = 1000

    @display(description='Artist')
    def get_artist(self, obj):
        return obj.artist.title

    @display(description='Album Artist')
    def get_album_artist(self, obj):
        return obj.album_artist.title

    @display(description='Genre')
    def get_album_genre(self):
        print("I Have no Idea")

admin.site.register(MusicAlbums, MusicAlbumsAdmin)

извлечение get_album_artist кажется не проблемой, поскольку это ForeignKey, но как получить значения ManyToManyField?

На самом деле я хочу что-то вроде этого:

@display(description='Genre')
def get_album_genre(self, obj):
    return obj.genre_relation.genre.name

Но я предполагаю, что мне нужна какая-то конструкция цикла for, есть идеи?

Хорошо, это довольно просто и фактически делается так же, как и в шаблоне:

@display(description='Genre')
def get_album_genre(self, obj):
    return ", ".join([str(genre.name) for genre in obj.genre_relation.all()])
Вернуться на верх