ManyToManyField 上的可选附加数据

Posted

技术标签:

【中文标题】ManyToManyField 上的可选附加数据【英文标题】:Optional additional data on ManyToManyField 【发布时间】:2011-08-25 14:31:57 【问题描述】:

我在 Django 中有一个 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 执行一些自动操作。特别烦人的是,在后台创建 Event 时,Speaker 列表不可用。

我意识到通常 Django 不知道在 Role.role 字段中输入什么。但这是可选的 (blank=True)。我会期待的

要么 Django 识别出 Role 只有可选字段,并让我像往常一样使用多对多关系(创建具有空默认值的字段),要么 Django 管理员允许我将演讲者添加到新创建的事件中,并且对于每个这样的演讲者,它都会要求提供附加信息(Role.role 的值)。

第二种可能比第一种更有用,也更通用。 Django 管理员仍然没有执行这两个操作:而是从事件中删除了扬声器字段。

有没有办法让 Django 管理员的行为如上所述?

【问题讨论】:

【参考方案1】:

解决方案在于this answer。简而言之,应该使用InlineModelAdmin,如here 所记录的那样。这正好实现了我描述的第二种行为。

【讨论】:

以上是关于ManyToManyField 上的可选附加数据的主要内容,如果未能解决你的问题,请参考以下文章

如何让 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?

Angular 指令的隔离范围上的可选双向绑定

Vue路由器上的可选参数

当 hasTVPreferredFocus 被忽略时,有没有办法强制关注安卓电视上的可选内容?

Web Api 属性路由中的可选参数

Django:如何将数据保存到ManyToManyField?