Django通过关系

时间:2014-11-28 10:48:59

标签: django

我有一个Person类,一个Project类和Contract类。一个项目导致人们被聘用的合同。现在我想要一个与他们的合同相关的人的课程,所以我创建另一个类,ContractStaff,以实现一个完整的关系:

class Person(models.Model):
    name = CharField
    adress = CharField
    #contract_staff is a list of all the Contracts a single Person object has
    contract_staff = ManyToManyField(Contract, through = 'ContractStaff')

class ContractStaff(models.Model):
    person = ForeignKeyField(Person)

class Contract(models.Model):
    id_ref = IntegerField
    starting_date = DateField
    ending_date = DateField
    contract_staff = ForeignKey(ContractStaff)
    project = OneToOneField(Project)

class Project(models.Model):
    title = CharField
    id_ref = IntegerField
           ...

我在其他示例中看到的是具有两个FK的中间类,在我的示例中是Contract类,其中包含其中一个,连接其他两个类。由于ContractStaff可能有许多合同而且一个合同只有一个ContractStaff,我猜FK字段应该在Contract类中。我错了吗?这个模型是否正确?

1 个答案:

答案 0 :(得分:2)

ManyToManyField通过具有两个外键的直通表实现到连接的表。如果你没有那个,那么你拥有的不是多对多的领域。

例如,如果你想让一个人可以连接到多个合同,并且一个合同可以连接到多个人,那么你需要一个ManyToManyField。它将在一个人和一个合同之间的每个连接的直通表中实现一行,因此每个连接将具有正好1个人和1个合同,因此两个外键。

如果你还想要一些关于连接的额外信息(例如,一个Person作为“项目负责人”连接到一个Person,另一个作为“程序员”),则使用直通模型,然后你可以使模型隐含,为该角色在该模型上添加一个字段。

你所拥有的不是ManyToManyField。

编辑:具体来说,如果合同可以有一个ContractStaff,而ContractStaff可以有一个Person,那么从Contract到ContractStaff与Person之间存在多对一关系,而不是ManyToMany。