Django:将User模型或Profile模型用于相关模型

时间:2017-06-06 16:05:50

标签: python django

这里的一般问题(更具体地说是Django / Python),当创建一个模型,例如Company,并且几个用户(员工)将与这样的模型相关时,不同的模型应该如何相关吗?

即。用户配置文件将通过OneToOneField与用户对象相关联。但是,如果Company对象通过ForeignKey与User对象或UserProfile对象相关联,为什么这是适当的方式?

所以

class UserProfile(models.Model): # For the Company Employees
    user = models.OneToOneField(UserModel, related_name='employeeprofilemodel', on_delete=models.CASCADE, blank=True,
    null=True)
    ...
    company_rel = models.ForeignKey(CompanyModel, related_name='companyrel', null=True)

class User(AbstractBaseUser): # For all Users
    ...
    company_rel = models.ForeignKey(CompanyModel, related_name='companyrel', null=True)

1 个答案:

答案 0 :(得分:2)

这更多是基于意见的问题,而不是技术性问题。我推荐以前的方式,即与AUTH_USER_MODEL创建一对一的关系。然后,您可以将员工相关数据存储在User Profile表中,该表可以通过ForeignKey关系与Company表相关联。这种数据库模式的优点是,您可以在将来更改User表(即AUTH_USER_MODEL)(当然,如果需要),而不会影响可能敏感的员工详细信息。 User表独立于数据库中的Company表,可用于授权。在数据库查询期间也会携带更少的数据,并且可以隐式地实现一小部分优化。我认为这比从auth.User模型扩展更合适。

无论何时需要数据库重构,后一种方式都可能危及上述敏感数据。此外,当用户模型拥有的数据多于用户所需的数据时,查询会更加繁重。使用用户表处理数据库查询时,可能需要特别注意优化。