Django - 如何在选择字段中显示相关的多对多字段?

时间:2021-07-20 23:00:46

标签: django django-models

我正在使用 Django 为我的音乐收藏构建一个网络应用程序。每张专辑都有多首歌曲,每首歌曲都有一个或多个作曲家。这是歌曲模型:

class Song(models.Model):
    title = models.CharField(max_length=50)
    composer = models.ManyToManyField(Artist)

    class Meta:
        ordering = ['title']
    
    def __str__ (self):
        return self.title

Artist 模型包含 firstnamelastname 字段。

同名歌曲多次出现,唯一的区分方法是由作曲家来区分。目前,当歌曲加载到选择字段时,只显示标题,使用 __str__() 方法。我试图包括作曲家,但还没有找到使它起作用的方法。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您需要以某种方式将作曲家的名字插入到 Song__str__ 方法中。

一种方法是获取作曲家的名字和姓氏,并在显示在 __str__ 之前对其进行格式化。以下面的例子:

def __str__(self):
   raw_composers = self.composers.values_list("first_name", "last_name")
   stringified_composers = [f"{first_name} {last_name}" for (first_name, last_name) in raw_composers]
   formatted_composers = ", ".join(stringified_composers)
   return f"{self.title} ({formatted_composers})"

虽然这确实有效,但显示这些选项的 Django 管理页面将执行大量查询(即,对列表中的每首歌曲进行 N 次查询,其中 N 是与这首歌曲相关的艺术家数量)。 请务必运行 .prefetch_related(...) 以加快速度!

相关问题