让我们说我想跟踪从事项目工作的员工。
Project 2015
-员工
员工A现在更改了他的医疗保健提供者, 并完成学士学位。
Project 2018
-员工A
对于Project 2018,员工A详细信息是最新的。但是如果我看 回到项目2015,“员工A”详细信息现在比项目本身更新。例如,现在看起来员工A在Project 2015工作时拥有学士学位,这是不正确的。 我需要的是一个雇员实例,将他保存到项目中时冻结在时间/时间记录/快照/副本中。同时仍然能够更新员工的“实时”版本。
在其他模型中,我也会遇到相同的问题。这真的让我感到困惑,因为它对于数据库思维是如此的违反直觉。是否有正确/正确的方法来处理此问题。可能有Django版本吗?解?谢谢!
答案 0 :(得分:1)
我遇到了类似的挑战,我们通过制定一种模式将其解决了,解决了这一问题:
class EmployeeProfile(Model):
class Meta:
abstract = True
common_field1 = CharField()
common_field2 = CharField()
common_field3 = CharField()
def get_employee_profile_data(self):
return {
'common_field1': self.common_field1,
'common_field2': self.common_field2,
'common_field3': self.common_field3,
}
class Employee(EmployeeProfile):
specific_fields
class ProjectProfile(EmployeeProfile):
class Meta:
unique_together = ('project', 'employee')
project = ForeignKey(Project)
owner = ForeignKey(Employee) # Means that the Employee "owns" this profile
# A factory function
def create_project_profile(employee, project):
return ProjectProfile.objects.create(
project=project,
owner=employee,
**employee.get_employee_profile_data())
我们试图将关注点分开考虑。
在这种情况下,我认为该模式满足以下条件:
一个项目具有由雇员拥有的项目特定的配置文件
一个员工每个项目只能有一个配置文件
可以更改项目的特定配置文件而不会影响“实时数据”
好处是数据库迁移将同时影响Employee和ProjectProfile,将get_employee_profile_data置于unittest下应该很简单。 所有者参考将确保轻松查询项目的参与者等。
希望它可以给出一些想法...
答案 1 :(得分:0)
项目django-simple-history非常有用,您可以拥有对象的快照。