多对多或一对多 Django
Many to Many or One to Many Django
我在 Django 中有以下两个模型。一个基本上是基本 Django 用户 class 的扩展,另一个是公司模型。我想说一个用户可以属于一个或多个公司,一个公司也可以有一个或多个联系人="Users"。这是一个正确的设置吗?我应该如何表示用户和公司之间的关系?
用户配置文件模型:
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
这允许每家公司有许多个联系人,每个用户都是许多个公司的联系人——因此是多对多.
现在,如果您需要额外的数据来描述多对多关系,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")
我在 Django 中有以下两个模型。一个基本上是基本 Django 用户 class 的扩展,另一个是公司模型。我想说一个用户可以属于一个或多个公司,一个公司也可以有一个或多个联系人="Users"。这是一个正确的设置吗?我应该如何表示用户和公司之间的关系?
用户配置文件模型:
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
这允许每家公司有许多个联系人,每个用户都是许多个公司的联系人——因此是多对多.
现在,如果您需要额外的数据来描述多对多关系,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")