[英]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.