及时冻结django模型对象,例如快照

时间:2018-07-19 08:23:24

标签: sql django model instance revision

让我们说我想跟踪从事项目工作的员工。

Project 2015
-员工

员工A现在更改了他的医疗保健提供者, 并完成学士学位。

Project 2018
-员工A

对于Project 2018,员工A详细信息是最新的。但是如果我看 回到项目2015,“员工A”详细信息现在比项目本身更新。例如,现在看起来员工A在Project 2015工作时拥有学士学位,这是不正确的。 我需要的是一个雇员实例,将他保存到项目中时冻结在时间/时间记录/快照/副本中。同时仍然能够更新员工的“实时”版本。

在其他模型中,我也会遇到相同的问题。这真的让我感到困惑,因为它对于数据库思维是如此的违反直觉。是否有正确/正确的方法来处理此问题。可能有Django版本吗?解?谢谢!

2 个答案:

答案 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非常有用,您可以拥有对象的快照。

相关问题