[英]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_name
和last_name
字段,因此您不需要僅用於該數據的其他模型。 同樣,您實際上並不需要CompanyContact
因為User
模型還包含email
和name
(同樣通過first_name
和last_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.