我有一个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类中。我错了吗?这个模型是否正确?
答案 0 :(得分:2)
ManyToManyField
通过具有两个外键的直通表实现到连接的表。如果你没有那个,那么你拥有的不是多对多的领域。
例如,如果你想让一个人可以连接到多个合同,并且一个合同可以连接到多个人,那么你需要一个ManyToManyField。它将在一个人和一个合同之间的每个连接的直通表中实现一行,因此每个连接将具有正好1个人和1个合同,因此两个外键。
如果你还想要一些关于连接的额外信息(例如,一个Person作为“项目负责人”连接到一个Person,另一个作为“程序员”),则使用直通模型,然后你可以使模型隐含,为该角色在该模型上添加一个字段。
你所拥有的不是ManyToManyField。
编辑:具体来说,如果合同可以有一个ContractStaff,而ContractStaff可以有一个Person,那么从Contract到ContractStaff与Person之间存在多对一关系,而不是ManyToMany。