簡體   English   中英

多對多或一對多Django

[英]Many to Many or One to Many Django

我在Django中有以下兩個模型。 一個基本上是基本Django用戶類的擴展,另一個是公司模型。 我想說一個用戶可以屬於一個或多個公司,並且一個公司也可以有一個或多個聯系人=“用戶”。 這是正確的設置嗎? 我該如何代表用戶與公司之間的紐帶?

用戶個人資料模型:

class Profile(models.Model):
    user = models.OneToOneField(User)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

公司型號:

class Company(models.Model):
    name = models.CharField(max_length=120)
    account_name = models.CharField(max_length=10, default="")
    sales_rep = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_sales", default="")
    csr = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_csr", default="")

class CompanyContact(models.Model):
    name = models.CharField(max_length=40, default="")
    email = models.CharField(max_length=50, default="")
    user = models.ForeignKey(User)
    company = models.ForeignKey(Company)

首先,是否有擴展User模型的理由? 默認模型已經包含first_namelast_name字段,因此您不需要僅用於該數據的其他模型。 同樣,您實際上並不需要CompanyContact因為User模型還包含emailname (同樣通過first_namelast_name )字段。

您可以將聯系人添加為ManyToManyField 如果要使用自定義Profile模型而非User ,只需將User (在ManyToManyField )替換為Profile

class Company(models.Model):
    name = models.CharField(max_length=120)
    account_name = models.CharField(max_length=10, default="")
    sales_rep = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_sales", default="")
    csr = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_csr", default="")
    contacts = models.ManyToManyField(User) # or Profile

這樣一來,每個公司都可以擁有許多聯系人,每個用戶都可以成為許多公司的聯系人-因此是多對多。


現在,如果您想要額外的數據來描述多對多關系,則可以使用另一個模型 例如,您可能想要保留一個記錄,如果該聯系人仍處於活動狀態或他們的角色是什么。 因此,您可能具有類似於以下內容的CompanyContact模型:

class CompanyContact(models.Model):
    active = models.BooleanField(default=False)
    role = models.CharField(max_length=50, default="")
    user = models.ForeignKey(User) # or Profile
    company = models.ForeignKey(Company)

然后,聲明ManyToManyField關系以使用此新模型:

class Company(models.Model):
    ...
    contacts = models.ManyToManyField(User, through="CompanyContact")
    # or contacts = models.ManyToManyField(Profile, through="CompanyContact")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM