django - Django - 将用户活动(查询 - GET/FILTER/UPDATE/DELETE)记录到数据库
问题描述
我正在构建一个符合 HIPAA 的应用程序,我想将每个用户操作记录到数据库中。
这包括用户在模型上调用get
、filter
或delete
object 方法时。我想将此功能添加到预先存在的应用程序中。
_ = ModelA.objects.get(id=1)
_ = ModelA.objects.filter(age__gt=10)
_ = ModelA.objects.filter(age__lt=5).delete()
我想记录每个数据库操作。
Django Activity Stream
不适用于get
方法。
如何实现此功能?
解决方案
如果您查看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包,该包提供了软删除功能,因此仍保留已删除的信息以保护日志的完整性。
推荐阅读
- vue.js - 如何获取CSV文件中的数据
- php - 我可以在没有 JavaScript 的情况下将子元素附加到我的 PHP 主页面中的元素吗?
- php - Laravel为什么在测试缺少的字段时发布请求返回状态302而不是422
- ssis - SSIS:如何从 project.params 值参数化 foreach 文件夹循环位置?
- size - 在 Influxdb 2.0 中,如何在磁盘上查找存储桶的大小(以字节为单位)?
- c - 如何在 C 程序中使用每次重新启动时都相同的相同地址
- macos - 警告:在 macOS 上使用 Brew 调用“sha256”“摘要”
- arrays - 添加 2 个或更多十进制/十六进制/二进制数组的最有效方法
- c++ - 防止子类访问“祖父母”类的受保护成员变量
- gekko - 使用 gekko 变量求和的意外结果