0

我们正在使用 django-simple-history 来跟踪我们模型的变化。所有模型都有一个history = HistoricalRecords()字段。从 python shell 对模型进行更改时,会跟踪更改,但是该changed_by字段保存为None. 当在 admin 中进行更改时,simple_history 中间件会从登录的人那里获取 User 实例。显然在 shell 中我们没有。有没有办法根据现有的 Account 对象手动注入 User 实例?

不幸的是,我无法更改任何这些模型,因此我无法将任何历史用户 getter 和 setter 添加到我们的模型中(项目经理对重构非常严格,我们也有很多模型)

4

2 回答 2

1

文档中所示,对于一个名为 history 的特定对象ObjectWithHistory,您可以在保存之前在对象上设置历史用户,如下所示:

o = ObjectWithHistory(*kwargs)
o._history_user = this_user
o.save()
于 2019-10-07T20:20:21.153 回答
1

使用中间件

如果您通过 django 视图编辑数据库,HistoryRequestMiddleware中间件会自动处理

self.client.post(reverse("frontend:application_create"), data=data)

而不是直接在命令行中

myapp.models.Application.objects.create(name='My application')

示例(单元测试)

这是一个单元测试,用于找出哪个用户更改了记录(受django-simple-history 单元测试的启发)。

# tests.py
class HistoryTestCase(TestCase):
    def test_changed_by(self):
        """Find out which user changed a record"""

        # First, let's create and log a user in
        user = get_user_model().objects.create_user("jimihendrix", password="pwtest")
        self.client.login(username="jimihendrix", password="pwtest")

        # Let's create a new entry
        data = {"name": "A new application", }
        response = self.client.post(reverse("frontend:application_create"), data=data)

        # This how you know who changed the record
        self.assertEqual(app1.history.earliest().history_user, user)
        self.assertEqual(app1.history.last().history_user, user)
        self.assertEqual(app1.history.first().history_user, user)

# urls.py
    # ...
    path('application/create/', old_views.ApplicationCreate.as_view(), name='application_create'),
    # ...

# models.py
class Application(models.Model):
    name = models.CharField(max_length=200)

于 2021-07-20T10:55:59.770 回答