簡體   English   中英

Django - 如何在選擇字段中顯示相關的多對多字段?

[英]Django - how to display related many-to-many field in choice field?

我正在使用 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__()方法只顯示標題。 我試圖包括作曲家,但還沒有找到使它起作用的方法。 有什么建議么?

您需要以某種方式將作曲家的名字插入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(...)來加快速度!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM