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
相关产品推荐
相关产品推荐

