Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动保存数据库中创建或修改行的用户的最佳方法是什么?_Python_Django_Django Models - Fatal编程技术网

Python 自动保存数据库中创建或修改行的用户的最佳方法是什么?

Python 自动保存数据库中创建或修改行的用户的最佳方法是什么?,python,django,django-models,Python,Django,Django Models,我的目标是构建一个抽象的BaseModel模型,该模型将具有以下属性: 创建日期 由创建的\u-链接到用户模型 更新日期 更新的_by-链接到用户模型 对于创建的日期和更新的日期,可以使用auto\u now和auto\u now\u add参数 对于created_by和updated_by,我找不到如何以线程安全的方式自动执行。 当然,我可以对视图中的每个模型执行此操作,但我希望避免重复自己的操作,而只在一个位置执行一次 所以我想在我的抽象模型上访问会话请求或请求对象本身 有什么想法吗?您无

我的目标是构建一个抽象的BaseModel模型,该模型将具有以下属性:

  • 创建日期
  • 由创建的\u-链接到用户模型
  • 更新日期
  • 更新的_by-链接到用户模型
  • 对于创建的日期和更新的日期,可以使用
    auto\u now
    auto\u now\u add
    参数

    对于created_by和updated_by,我找不到如何以线程安全的方式自动执行。 当然,我可以对视图中的每个模型执行此操作,但我希望避免重复自己的操作,而只在一个位置执行一次

    所以我想在我的抽象模型上访问会话请求或请求对象本身


    有什么想法吗?

    您无权访问来自您的模型的请求(以及当前用户)。这是在Django设计的

    更直接的方法不那么枯燥,但更明确:

  • (或)
  • 但是,如果您想真正透明地保存创建者/修改器,即更干燥但不太明确,您可以:

  • 或者,您可以使用threadlocal通过设置当前用户,然后在模型
    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
    

    感谢您的回答,您在实际项目中使用过这些策略吗?您有什么建议吗?每种方法的优缺点是什么?在哪些情况下,这些策略将不起作用?请注意,我们在生产中使用了这种策略,它不是线程安全的。我不知道为什么,但用户往往会混淆。。。