Python 自动保存数据库中创建或修改行的用户的最佳方法是什么?
我的目标是构建一个抽象的BaseModel模型,该模型将具有以下属性:Python 自动保存数据库中创建或修改行的用户的最佳方法是什么?,python,django,django-models,Python,Django,Django Models,我的目标是构建一个抽象的BaseModel模型,该模型将具有以下属性: 创建日期 由创建的\u-链接到用户模型 更新日期 更新的_by-链接到用户模型 对于创建的日期和更新的日期,可以使用auto\u now和auto\u now\u add参数 对于created_by和updated_by,我找不到如何以线程安全的方式自动执行。 当然,我可以对视图中的每个模型执行此操作,但我希望避免重复自己的操作,而只在一个位置执行一次 所以我想在我的抽象模型上访问会话请求或请求对象本身 有什么想法吗?您无
auto\u now
和auto\u now\u add
参数
对于created_by和updated_by,我找不到如何以线程安全的方式自动执行。
当然,我可以对视图中的每个模型执行此操作,但我希望避免重复自己的操作,而只在一个位置执行一次
所以我想在我的抽象模型上访问会话请求或请求对象本身
有什么想法吗?您无权访问来自您的模型的请求(以及当前用户)。这是在Django设计的 更直接的方法不那么枯燥,但更明确:
save()
方法中再次访问该threadlocal李>
这是第一个更透明的选项:
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
感谢您的回答,您在实际项目中使用过这些策略吗?您有什么建议吗?每种方法的优缺点是什么?在哪些情况下,这些策略将不起作用?请注意,我们在生产中使用了这种策略,它不是线程安全的。我不知道为什么,但用户往往会混淆。。。