簡體   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