首页 > 解决方案 > Django - 将用户活动(查询 - GET/FILTER/UPDATE/DELETE)记录到数据库

问题描述

我正在构建一个符合 HIPAA 的应用程序,我想将每个用户操作记录到数据库中。

这包括用户在模型上调用getfilterdeleteobject 方法时。我想将此功能添加到预先存在的应用程序中。

_ = ModelA.objects.get(id=1)
_ = ModelA.objects.filter(age__gt=10)
_ = ModelA.objects.filter(age__lt=5).delete()

我想记录每个数据库操作。 Django Activity Stream不适用于get方法。

如何实现此功能?

标签: djangodatabaseloggingmodelsignals

解决方案


如果您查看django-hipaa,它可以为您提供一个工作框架。我没有直接复制它,但我的想法是创建一个抽象的日志模型——非常简单:

#in models.py
    
class Log(models.Model):
    user = models.ForeignKey(User, on_delete=PROTECT) #because you want to preserve the log
    created_on = models.DateTimeField(auto_now_add=True)
    action_taken = models.CharField(max_length=255)
    
    class Meta:
        abstract = True

然后为每个要记录的数据库,创建一个日志模型:

#still in models.py

class ModelALog(Log):
    row = models.ForeignKey(ModelA, on_delete=Protect)
    #whatever other information you want to log

然后在您的views.py中,您可以在创建涉及要记录的数据库查询的视图时保存日志:

#in views.py

def some_view_with_ModelA(request):
    something = ModelA.objects.get(pk=1)
    log = ModelALog.objects.create(user=request.user, 
          action_take='your description', row=something)
    return render(yourview.html)

这可能意味着您必须创建额外的视图来执行与管理门户中可能执行的相同功能,但它可以确保记录您想要记录的所有事件。

您还可以在考虑删除时查看django-safedelete包,该包提供了软删除功能,因此仍保留已删除的信息以保护日志的完整性。


推荐阅读