在运行时在 Django 中指定关系动词?
Posted
技术标签:
【中文标题】在运行时在 Django 中指定关系动词?【英文标题】:Specify relationship verbs in Django at runtime? 【发布时间】:2014-07-23 02:29:34 【问题描述】:在 Django 中如何识别模型关系动词?
所以,假设我有一个模型 Movie
,并且想要 Director
和 Writer
的字段。我不想为这些角色创建两个不同的表,如下所示:
...因为它违反了数据库最佳实践(正常形式等),并且不会保持干燥。相反,我想要一个 Person
模型,通过 ManyToMany
与 Movie
的关系,如下所示:
如何允许在运行时指定这些以菱形标记的动词?
例如,在 Django Admin 中,Movie
应该有一个 Person
字段,并有一些地方可以输入 Role
,例如written by
或 directed by
。我不想在Movie
中为每个可能的角色设置字段:例如,我不想要director
或writer
或animal_trainer
字段。可能有数百个......其中一些是重复的。
在 Rails 中,我只是创建一个带有额外字段 Role
的连接表,但我认为 Django 有更好的方法。
我确定这在 Django 文档中的某处进行了记录,或者可能只是在某处的一般 SQL 文档中,但我想我不知道 Google 的正确搜索词。如果存在相关文档的链接就足够了。谢谢!
【问题讨论】:
我很确定您需要第三张表来说明人和电影之间的关系,例如(“导演”、“演员”、“作者”、“关键握把”等)Table("movie_role",["movie","person","role"])
类型的东西
你的意思是像一个连接表?
【参考方案1】:
我认为(在这种情况下)你最好的选择是简单地有 2 个模型,电影和人,并在电影表中有 2 个外键,一个用于作家,一个用于导演,因为每部电影都会有这两者字段,例如
def Person(models.Model):
...
def Movie(models.Model):
writer = models.ForeignKey(Person, related_name='movies_written')
director = models.ForeignKey(Person, related_name='movies_directed')
...
编辑
根据您的问题,我相信最好的答案来自https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships
def Person(models.Model):
...
def Movie(models.Model):
...
workers = models.ManyToManyField('Person', through='WorkedOn')
# model in case you want to specify anything specific for roles for every person
def Role(models.Model):
...
# can have extra fields, e.g. dates worked, pay, etc.
def WorkedOn(models.Model):
person = models.ForeignKey('Person')
movie = models.ForeignKey('Movie')
role = models.ForeignKey('Role')
...
【讨论】:
是的,我想就是这样,看起来很简单。特别是:related_name
是填补这里空白的属性,我认为,我不知道谷歌。谢谢!
想知道,虽然...related_name
可用,为什么还要ManyToMany?
现在我再看一遍,虽然这很接近,但我不太确定。问题是这将导致Movie
中的大量字段,其中一些是假设的,或者是特定Movie
独有的。例如,这意味着每个Movie
都需要一个字段key_grip
和assistant_key_grip
和animal_trainer
。如果有两个assistant_key_grip
s 怎么办?另一个领域。我真的想要一个更灵活的解决方案,它允许用户输入Person
的动词或角色,以便在运行时输入。我将编辑我的问题。
再看一遍,我觉得这又是正确的答案。 :) 对于更复杂的东西,可能应该有一些抽象基类和/或继承。谢谢。以上是关于在运行时在 Django 中指定关系动词?的主要内容,如果未能解决你的问题,请参考以下文章
在 aws 上部署应用程序时在 package.json 中指定节点 js 版本