如何识别Django中的模型关系动词?
因此,假设我有一个模型Movie
,并且需要Director
和Writer
的字段。我不想为这些角色设置两个不同的表格,如下所示:
...因为它违反了数据库最佳实践(正常形式等),并且不会让事情变得干燥。相反,我希望通过与Person
的{{1}}关系建立单个ManyToMany
模型,如下所示:
如何在运行时指定钻石中标记的动词?
例如,在Django管理员中,Movie
应该有一个Movie
字段,有一些地方可以输入Person
,例如Role
或written by
。我不想在directed by
中为每个可能的角色添加字段:例如,我不想要Movie
或director
或writer
字段。可能有数百个...其中一些重复。
在Rails中,我只是创建一个带有额外字段animal_trainer
的连接表,但我认为Django有更好的方法。
我确定这是在Django文档中的某个地方记录的,或者可能只是在某些地方的一般SQL文档中,但我想我不知道谷歌的正确搜索条件。如果存在相关文档的链接就足够了。谢谢!
答案 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')
...