繁体   English   中英

自动保存谁在数据库中创建或修改了行的最佳方法是什么?

[英]What is the best approach to automatocally save who created or modified a row in the database?

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

  1. 创建日期
  2. created_by-链接到USER模型
  3. 日期date_updated
  4. Updated_by-链接到USER模型

对于date_created和date_updated,可以,我可以使用auto_nowauto_now_add参数。

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

所以我想像在我的抽象模型上访问会话请求或请求对象一样...

任何想法?

您无权访问模型中的请求(因此也无法访问当前用户)。 这是在Django中设计的。

更直接的方法是更少的DRY,但更明确:

  1. 创建一个可重用的ModelForm ,在保存表单时自动将用户保存到模型
  2. 创建基于可重用的类的View ,该View可自动将用户保存到模型中
  3. 创建或可ModelAdmin自动将用户保存到模型 (或此答案

但是,如果您想要真正透明地保存创建者/修改者,那就是更干燥,但不太明确,您可以:

  1. 编写一些中间件,以便在使用信号保存时将用户信息透明地保存到模型中
  2. 或者,您可以使用threadlocal通过一个更简单的中间件来设置当前用户,然后在模型的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM