You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-simple-history如何获取修改对象的操作用户?

问题原因与解决方法

1. 你当前测试场景的问题

你在Django Shell中执行修改操作,simple_history 自带的HistoryRequestMiddleware 仅能在HTTP请求链路中自动捕获当前登录的用户,Shell环境没有请求上下文,因此修改记录不会自动关联操作用户,history_user字段默认为空。

2. 正确获取操作用户的写法

你之前的调用语法有误,缺少属性访问的点符号,正确写法为:

# 两种写法等价,latest()默认按历史时间倒序取最新一条
customer.history.all().last().history_user
customer.history.latest().history_user

3. Web请求场景配置校验

如果在Web请求的业务逻辑中也拿不到操作用户,请排查以下配置:

  • 确认 HistoryRequestMiddleware 在settings.py的MIDDLEWARE列表中,放在django.contrib.auth.middleware.AuthenticationMiddleware之后,必须先完成用户认证才能捕获到登录用户
  • 确认发起修改请求的用户为已登录状态,匿名用户默认不会关联到history_user

4. 无请求上下文场景手动指定操作用户

如果是Shell、脚本、异步任务等没有HTTP请求上下文的场景,可以手动给模型实例绑定_history_user属性再保存,即可关联操作用户:

from django.contrib.auth.models import User

# 取要关联的操作用户
operator = User.objects.get(username="your_username")
customer = Customer.objects.last()
customer.name = "Test"
# 手动绑定操作用户
customer._history_user = operator
customer.save()

# 此时即可正常获取到操作用户
print(customer.history.latest().history_user)

内容的提问来源于stack exchange,提问作者Jorge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:57:02