【问题标题】:Freeze django model object in time, like a snapshot及时冻结 django 模型对象,就像快照一样
【发布时间】:2018-12-27 07:16:54
【问题描述】:
假设我想跟踪从事项目的员工。
2015 年项目
- 员工 A
员工 A 现在更换了他的医疗保健提供者,
地址并完成他的学士学位。
2018 年项目
- 员工 A
对于 Project 2018,员工 A 的详细信息是最新的。但如果我看
回到 2015 年项目,员工 A 的详细信息现在比项目本身更新。例如,现在看起来员工 A 在 Project 2015 工作时拥有学士学位,这是不正确的。
我需要的是一个员工 A 在将他保存到项目时冻结在时间/时间胶囊/快照/副本中的实例。同时仍然能够更新员工的“实时”版本。
还有其他模型我会遇到同样的问题。这真的让我大吃一惊,因为它对于数据库思维是如此违反直觉。是否有正确/正确的方法来处理这个问题。可能有 Django 修订版吗?解决方案?谢谢!
【问题讨论】:
标签:
sql
django
model
instance
revision
【解决方案1】:
django-simple-history 项目非常有用,您可以拥有对象的快照。
【解决方案2】:
我遇到了类似的挑战,我们通过一种模式来解决这个问题,该模式可以粗略地转化为该领域:
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 下应该很简单。
所有者参考将确保轻松查询项目的参与者等。
希望能给点思路...