我正在使用 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
模型包含 firstname
和 lastname
字段。
同名歌曲多次出现,唯一的区分方法是由作曲家来区分。目前,当歌曲加载到选择字段时,只显示标题,使用 __str__()
方法。我试图包括作曲家,但还没有找到使它起作用的方法。
有什么建议吗?
答案 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(...)
以加快速度!