2016-12-31 85 views
2

我在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) 

回答

3

首先,有沒有理由延長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 

這使得每家公司擁有許多聯繫人和每個用戶是許多公司接觸 - 因而許多一對多。現在


,如果你想額外的數據來描述許多一對多的關係,you can have another model for that。例如,如果聯繫人仍處於活動狀態或他們的角色是什麼,您可能需要保留一條記錄。所以,你可能有一個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") 
+1

真棒!我想給公司聯繫添加姓名和電子郵件,因爲「聯繫人」沒有個人資料。管理員可以爲該公司輸入他們自己的手動聯繫人,同時還可以將實際用戶鏈接爲公司聯繫人 –

+1

另外,配置文件將包含更多信息,然後是first_name和last_name。將來它可能包含:主題,生日,訪問規則。 –

+0

@SamMunroe複製聯繫人中的電子郵件/姓名可能會有點不方便。相反,我建議如下:通過「CompanyContact」保持'User'和'Company'之間的ManyToMany關係,然後在添加聯繫人時始終創建一個'User'。 「個人資料」是分開的,包含附加信息,但不需要成爲聯繫人。 –