【问题标题】:Django Admin - how to display ManyToManyField valuesDjango Admin - 如何显示 ManyToManyField 值
【发布时间】:2021-09-17 10:17:22
【问题描述】:

我想在我的 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"))

我的 Glue 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 循环构造,有什么想法吗?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    好吧,这很简单,实际上就像在模板中做的一样:

    @display(description='Genre')
    def get_album_genre(self, obj):
        return ", ".join([str(genre.name) for genre in obj.genre_relation.all()])
    

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2012-01-03
      • 2013-09-22
      • 2019-09-20
      相关资源
      最近更新 更多