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()])