及时冻结 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 模型对象,就像快照一样的主要内容,如果未能解决你的问题,请参考以下文章

访问 Outlook VBA 对象模型时单词冻结

62django之MTV模型(urls,view)

ORA-01861: 在 django 中执行获取模型对象时文字与格式字符串不匹配

Django - 自定义模型保存方法不显示属性值

是否有任何工具可以自动在Django中为模型创建模板

从 Tensorflow 对象检测 API 动物园模型导出错误的冻结图