Python Django-这个解决方案是干的还是有更好的方法来建模这些概要文件类和子类?

Python Django-这个解决方案是干的还是有更好的方法来建模这些概要文件类和子类?,python,django,django-models,dry,user-profile,Python,Django,Django Models,Dry,User Profile,基本上,我有以下要求: 用户具有个人用户配置文件 一个组织可以有一个员工档案 员工档案可以是独立的,也可以链接到用户 组织可以编辑员工档案,而无需更改用户的个人用户档案 用户更改其个人用户配置文件不会影响该用户的组织员工配置文件 用户可以是多个组织的员工(因此具有多个员工档案) 用户不必是员工 目前我有以下类(为了简单起见,删除了不相关的字段) profiles.models.py b.models.py 我想知道的是这个解决方案是否是干的,它是否是处理需求的最佳方式 我不确定的原因是,我考

基本上,我有以下要求:

  • 用户具有个人用户配置文件
  • 一个组织可以有一个员工档案
  • 员工档案可以是独立的,也可以链接到用户
  • 组织可以编辑员工档案,而无需更改用户的个人用户档案
  • 用户更改其个人用户配置文件不会影响该用户的组织员工配置文件
  • 用户可以是多个组织的员工(因此具有多个员工档案)
  • 用户不必是员工
目前我有以下类(为了简单起见,删除了不相关的字段)

profiles.models.py

b.models.py

我想知道的是这个解决方案是否是干的,它是否是处理需求的最佳方式

我不确定的原因是,我考虑过让StaffProfile扩展UserProfile而不是Profile,并将UserProfile中的OneToOneField更改为ForeignKey字段,但这似乎会使从员工档案中查找用户的个人档案变得复杂。除非我通过一个函数设置相关的_名称来更改相关的_名称,以便在UserProfile中它等于“profile”,在StaffProfile中它等于“staff_profiles”?然而,在这一点上,这仅仅是工程上的问题吗

此外,由于员工档案不必与用户关联,这是对员工档案进行建模的最佳方式,还是有更好的方式将用户链接到员工档案?例如,如果需要,是否有另一个类将用户链接到员工档案?我觉得这会再次增加复杂性/设计过度

如果你能告诉我你对这个问题的看法和我的解决方案,我将不胜感激

提前感谢您的帮助


GoingRoundInCircle

将StaffProfile实现为多对多关系的方式,用户在其所属的每个组织都拥有相同的员工档案。这是故意的吗?@cemper93-那是个好地方!它是这样的,因为最初我将有一个配置文件给一个用户,那就是它。然而,我希望组织能够控制员工的个人资料,这样员工就不会恶意更改他们的详细信息,因此我目前的解决方案是除了用户个人资料之外,还要有员工个人资料。。。(没有办法制作烘干机,是吗?)?或者,考虑到这些要求,您认为有更好的替代方案吗?谢谢你发现了!我认为您的模型代码在“干燥”方面没有任何问题,尽管这并不是谈论模型架构的合适术语。您应该考虑数据库规范化,这是一个相关的主题,但不尽相同。在任何情况下,是的,您建议的修复都会起作用。@cemper93-对不起,是的,我在前面的评论中是指规范化;我只是糊涂了。您认为我的解决方案是解决问题的正确方法,还是有更好的方法规范化数据?从理论上讲,对于给定的用户,配置文件数据应该在任何地方都是相同的,但我不知道如何阻止对数据的恶意更改,以及我将允许/禁止谁编辑来自所有组织的数据用户是该组织的工作人员以及用户自己。。。因此,为什么我认为每个组织都有一个员工档案,但却有大量重复数据。@cemper93-继续我最后的评论,另一个问题当然是,员工档案不必附加用户,因此我不能仅仅将数据的责任交给用户,例如,他们可能根本就不是。个人资料可能是该组织自己创建的。而且在任何情况下,用户仍然可能破坏他们的数据,这对组织都不好。
class Profile(TimeStampMixin):
   title    = models.CharField(max_length=6, choices=Title.choices, blank=True)
   forename = models.CharField(max_length=50, blank=True)
   surname  = models.CharField(max_length=50, blank=True)


class UserProfile(Profile):
   user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name="profile", on_delete=models.CASCADE)


class StaffProfile(Profile):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, db_index=True, related_name="staff_profiles")

class Organisation(TimeStampMixin):
   staff = models.ManyToManyField('profiles.StaffProfile', blank=True, related_name="organisations")