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

时间:2014-06-02 21:26:02

标签: python sql database django model

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

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

entity relationship diagram, incorrect

...因为它违反了数据库最佳实践(正常形式等),并且不会让事情变得干燥。相反,我希望通过与Person的{​​{1}}关系建立单个ManyToMany模型,如下所示:

entity relationship diagram, correct

如何在运行时指定钻石中标记的动词?

例如,在Django管理员中,Movie应该有一个Movie字段,有一些地方可以输入Person,例如Rolewritten by。我不想在directed by中为每个可能的角色添加字段:例如,我不想要Moviedirectorwriter字段。可能有数百个...其中一些重复。

在Rails中,我只是创建一个带有额外字段animal_trainer的连接表,但我认为Django有更好的方法。

我确定这是在Django文档中的某个地方记录的,或者可能只是在某些地方的一般SQL文档中,但我想我不知道谷歌的正确搜索条件。如果存在相关文档的链接就足够了。谢谢!

1 个答案:

答案 0 :(得分: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')
    ...