在运行时在 Django 中指定关系动词?

Posted

技术标签:

【中文标题】在运行时在 Django 中指定关系动词?【英文标题】:Specify relationship verbs in Django at runtime? 【发布时间】:2014-07-23 02:29:34 【问题描述】:

在 Django 中如何识别模型关系动词?

所以,假设我有一个模型 Movie,并且想要 DirectorWriter 的字段。我不想为这些角色创建两个不同的表,如下所示:

...因为它违反了数据库最佳实践(正常形式等),并且不会保持干燥。相反,我想要一个 Person 模型,通过 ManyToManyMovie 的关系,如下所示:

如何允许在运行时指定这些以菱形标记的动词?

例如,在 Django Admin 中,Movie 应该有一个 Person 字段,并有一些地方可以输入 Role,例如written bydirected by。我不想在Movie 中为每个可能的角色设置字段:例如,我不想要directorwriteranimal_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_gripassistant_key_gripanimal_trainer。如果有两个assistant_key_grips 怎么办?另一个领域。我真的想要一个更灵活的解决方案,它允许用户输入Person 的动词或角色,以便在运行时输入。我将编辑我的问题。 再看一遍,我觉得这又是正确的答案。 :) 对于更复杂的东西,可能应该有一些抽象基类和/或继承。谢谢。

以上是关于在运行时在 Django 中指定关系动词?的主要内容,如果未能解决你的问题,请参考以下文章

运行宏时在 Excel VBA 中指定路径

在 aws 上部署应用程序时在 package.json 中指定节点 js 版本

尽管在设置中指定了日期格式,但 Django 在运行测试时给了我一个“无效的日期格式”错误

动态导入在运行时从编译输出中指定的模块

DJANGO:当主键不是“id”时如何在夹具中指定主键

如何在 VBScript 中指定“以最高权限运行”?