及时冻结 django 模型对象,就像快照一样
Posted
技术标签:
【中文标题】及时冻结 django 模型对象,就像快照一样【英文标题】:Freeze django model object in time, like a snapshot 【发布时间】:2018-12-27 07:16:54 【问题描述】:假设我想跟踪从事项目的员工。
2015 年项目 - 员工 A
员工 A 现在更换了他的医疗保健提供者, 地址并完成他的学士学位。
2018 年项目 - 员工 A
对于 Project 2018,员工 A 的详细信息是最新的。但如果我看 回到 2015 年项目,员工 A 的详细信息现在比项目本身更新。例如,现在看起来员工 A 在 Project 2015 工作时拥有学士学位,这是不正确的。 我需要的是一个员工 A 在将他保存到项目时冻结在时间/时间胶囊/快照/副本中的实例。同时仍然能够更新员工的“实时”版本。
还有其他模型我会遇到同样的问题。这真的让我大吃一惊,因为它对于数据库思维是如此违反直觉。是否有正确/正确的方法来处理这个问题。可能有 Django 修订版吗?解决方案?谢谢!
【问题讨论】:
看起来您正在寻找纪念品图案en.wikipedia.org/wiki/Memento_pattern 【参考方案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 下应该很简单。 所有者参考将确保轻松查询项目的参与者等。
希望能给点思路...
【讨论】:
以上是关于及时冻结 django 模型对象,就像快照一样的主要内容,如果未能解决你的问题,请参考以下文章