【问题标题】:How to implement many to one multiple selection scenario in Django Admin?如何在 Django Admin 中实现多对一多选场景?
【发布时间】:2014-08-02 00:19:37
【问题描述】:

场景:一张专辑包含多首歌曲。一首歌曲有多个艺术家,可以没有或只有一张专辑。

我使用 ForeignKey 实现了 ManyToOne 关系。以下是模型:

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 Admin 中,在新专辑页面上,我想为该专辑选择多首歌曲。

额外问题:我还需要获取给定专辑的艺术家。有没有比从songs_set 获取所有艺术家更好的方法?

编辑:更新了歌曲 - 艺术家与多对多关系。

【问题讨论】:

  • 这不是对您问题的回答,而是:为什么一首歌最多只有一张专辑?重新发布呢?最好的?混音?合辑?
  • 因为,这是我能想到的最接近原始问题的类比。 :-)

标签: python django django-models django-admin


【解决方案1】:

查看管理文档,尤其是 InlineModelAdmin objects

from django.contrib import admin

class SongInline(admin.TabularInline):
    model = Song

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

admin.site.register(Album, AlbumAdmin)

要回答您的第二个问题,您可以通过 QuerySet 过滤器调用来跨越关系,如下所示:

Artist.objects.filter(
    song_set__album=GIVEN_ALBUM
)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2012-09-17
相关资源
最近更新 更多