Skip to main content
 首页 » 编程设计

python之多对多或一对多 Django

2024年08月21日28yjmyzz

我在 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 中)替换为简介。

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")