如何在Django Admin中实现多对一的多选场景?

0 投票
1 回答
837 浏览
提问于 2025-04-18 09:28

场景:一个专辑里有多首歌曲。一首歌曲可以有多个艺术家,并且可以没有专辑或只有一个专辑。

我使用外键实现了多对一的关系。以下是模型:

class Artist(models.Model):
    name = models.CharField(max_length=50, verbose_name=u'Artist Name')
    bio = models.TextField()

class Album(models.Model):
    title = models.CharField(max_length=50, verbose_name=u'Album Name')
    description = models.TextField()

class Song(models.Model):
    title = models.CharField(max_length=50, verbose_name=u'Song Name')
    album = models.ForeignKey(Album, null=True)
    artists = models.ManyToManyField(Artist)

现在,在Django的管理后台中,在新专辑页面,我想为这个专辑选择多首歌曲。

附加问题:我还需要获取某个专辑的艺术家。有没有比从歌曲集合中获取所有艺术家更好的方法?

编辑:将歌曲与艺术家的关系更新为多对多关系。

1 个回答

0

看看管理员文档,特别是关于 InlineModelAdmin 对象 的部分。

from django.contrib import admin

class SongInline(admin.TabularInline):
    model = Song

class AlbumAdmin(admin.ModelAdmin):
    inlines = [
        SongInline,
    ]

admin.site.register(Album, AlbumAdmin)

关于你的第二个问题,你可以通过查询集的过滤调用来连接这些关系,像这样:

Artist.objects.filter(
    song_set__album=GIVEN_ALBUM
)

撰写回答