2011-05-14 14 views
2

我在Django中有一個ManyToManyField,我想保存關係的附加信息。我在做什麼是ManyToManyField上的可選附加數據

class Speaker(models.Model): 
    name = models.CharField(max_length=50) 
    title = models.CharField(max_length=100, blank=True) 
    description = models.TextField(blank=True) 

class Event(models.Model): 
    title = models.CharField(max_length=120) 
    speakers = models.ManyToManyField(Speaker, blank=True, null=True, through='Role') 

class Role(models.Model): 
    speaker = models.ForeignKey(Speaker) 
    event = models.ForeignKey(Event) 
    role = models.CharField(max_length=50, blank=True) 

根據documentation,這可以防止Django做一些自動的東西。尤其令人討厭的是,它使得在管理員中創建事件時揚聲器列表不可用。

我意識到一般Django不知道要在Role.role字段中放什麼。但這是可選的(blank=True)。我預計

  • 或者Django的認識到,角色只有可選字段,讓我用多對多的關係像往常一樣(創建一個空的默認值的字段),或
  • Django管理讓我補充音箱到新創建的事件,併爲每個此類發言者索要附加信息(值爲Role.role)。

第二種可能性會比第一種更有用也更普遍。仍然Django管理員不會執行這兩個操作:而是將揚聲器字段從事件中刪除。

有沒有辦法讓Django的管理員像上面描述的那樣行事?

回答

0

解決方案在於this answer。簡而言之,應該使用InlineModelAdmin,如文件here所述。這實現了我所描述的第二種行爲。