[英]What is the best approach to automatocally save who created or modified a row in the database?
我的目标是建立一个具有以下属性的抽象BaseModel模型:
对于date_created和date_updated,可以,我可以使用auto_now
和auto_now_add
参数。
对于created_by和updated_by,我找不到如何以线程安全的方式自动执行此操作。 当然,我可以对视图上的每个模型执行此操作,但是我想避免重复自己并一次在一个位置执行此操作。
所以我想像在我的抽象模型上访问会话请求或请求对象一样...
任何想法?
您无权访问模型中的请求(因此也无法访问当前用户)。 这是在Django中设计的。
更直接的方法是更少的DRY,但更明确:
ModelForm
,在保存表单时自动将用户保存到模型 View
,该View
可自动将用户保存到模型中 ModelAdmin
自动将用户保存到模型 (或此答案 ) 但是,如果您想要真正透明地保存创建者/修改者,那就是更干燥,但不太明确,您可以:
save()
方法中再次访问该threadlocal。 您需要小心使用threadlocals 这是更透明的选项中的第一个:
from django.db.models import signals
from django.utils.functional import curry
class WhodidMiddleware(object):
def process_request(self, request):
if not request.method in ('GET', 'HEAD', 'OPTIONS', 'TRACE'):
if hasattr(request, 'user') and request.user.is_authenticated():
user = request.user
else:
user = None
mark_whodid = curry(self.mark_whodid, user)
signals.pre_save.connect(mark_whodid, dispatch_uid = (self.__class__, request,), weak = False)
def process_response(self, request, response):
signals.pre_save.disconnect(dispatch_uid = (self.__class__, request,))
return response
def mark_whodid(self, user, sender, instance, **kwargs):
if 'created_by' in instance._meta.fields and not instance.created_by:
instance.created_by = user
if 'modified_by' in instance._meta.fields:
instance.modified_by = user
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.