Django 中的多对多关系可以有两个外键吗?

Ear*_*der 0 django django-models

我有两个模型,公司模型和合同模型。每份合同都是两家公司之间的。现在,公司和合同之间似乎存在多对多的关系,例如,一家公司可以有许多合同,而一份合同是在多个公司之间进行的。它是否正确?如果是,如何在 Django 中指定?是通过一个模型中的两个外键吗?

class Company(models.Model):
    company_name = models.CharField(max_length = 30)
    address = models.CharField(max_length = 100)
    website = models.CharField(max_length = 30)
    email = models.EmailField(max_length = 30)

class Contract(models.Model):
    company_1 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company1")
    company_2 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company2")
    company = models.ManyToManyField(Company)
    contract_date = models.DateField()
    consideration = models.DecimalField(max_digit =10, decimal_places = 2)
Run Code Online (Sandbox Code Playgroud)

Wan*_*der 5

如果合同仅存在于两家公司之间,则只需删除此行即可。您的合同模型对公司有两个不同的外键字段这一事实已经意味着合同仅在两家公司之间存在,并且每家公司可能有多个可通过使用各自的 related_name 访问的合同。

class Contract(models.Model):
    company_1 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company1")
    company_2 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company2")
    # company = models.ManyToManyField(Company)
    contract_date = models.DateField()
    consideration = models.DecimalField(max_digit =10, decimal_places = 2)
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要一份涉及两家以上公司的合同,那么您可以删除两个外键并使用像这样的多对多关系。同样,这将自动意味着特定合同由该关系下列出的所有公司共享。您也可以通过特定公司的 related_name 访问其合同。

class Contract(models.Model):
    # company_1 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company1")
    # company_2 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company2")
    companies = models.ManyToManyField(Company, related_name=whatever_you_want)
    contract_date = models.DateField()
    consideration = models.DecimalField(max_digit =10, decimal_places = 2)
Run Code Online (Sandbox Code Playgroud)