【问题标题】:can a manytomany relationship have two foreign keys in Django?多对多关系可以在 Django 中有两个外键吗?
【发布时间】:2015-10-10 06:53:53
【问题描述】:

我有两个模型,公司和合同。每份合同都在两家公司之间。现在,公司和合同之间似乎存在多对多关系,例如一家公司可以有许多合同,并且一份合同在多个公司之间。它是否正确?如果是,如何在 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)

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    如果合同只是在两家公司之间,那么只需删除此行。您的 Contract 模型对 Company 有两个不同的外键字段这一事实已经暗示合同仅存在于两家公司之间,并且每家公司可以使用各自的 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)
    

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

    【讨论】:

    • 好的!如果您对他人的利益没有更多问题或澄清,请接受此答案!谢谢!
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2019-11-07
    • 2018-08-28
    • 2023-01-26
    • 2011-10-03
    • 2021-08-28
    相关资源
    最近更新 更多