【问题标题】: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 下应该很简单。 所有者参考将确保轻松查询项目的参与者等。

    希望能给点思路...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2022-01-21
      • 1970-01-01
      • 2018-07-22
      • 2015-10-31
      • 2017-07-03
      相关资源
      最近更新 更多