【问题标题】:Log all save/update/delete actions in all django models记录所有 django 模型中的所有保存/更新/删除操作
【发布时间】:2016-06-26 17:39:24
【问题描述】:

我的 django 应用中有几个模型。其中一些来自models.Model,一些来自django-hvad 的可翻译模型。 我想记录他们的每个保存/删除/更新操作。我知道管理操作的标准 django 记录器,但它们太简短且不冗长,无法满足我的需求。

一般来说,实现此目的的一种常见方法是使用这些操作定义超类并从中扩展每个模型。这不是我的情况,因为我的一些模型是可翻译的,而有些则不是。

第二种方式是方面/装饰器。我想,python/django 一定有类似的东西,但我不知道到底是什么:)

请为我提供最合适的记录方式。 谢谢!

【问题讨论】:

标签: django python-3.x django-models


【解决方案1】:

您可以为您的模型编写一个 mixin。

import logging

class LogOnUpdateDeleteMixin(models.Model):
    pass

    def delete(self, *args, **kwargs):
        super(LogOnUpdateDeleteMixin, self).delete(*args, **kwargs)
        logging.info("%s instance %s (pk %s) deleted" % (str(self._meta), str(self), str(self.pk),) # or whatever you like

    def save(self, *args, **kwargs):
        super(LogOnUpdateDeleteMixin, self).save(*args, **kwargs)
        logging.info("%s instance %s (pk %s) updated" % (str(self._meta), str(self), str(self.pk),) # or whatever you like

class Meta:
    abstract = True

现在只需在您的模型中使用它。

class MyModel(LogOnUpdateDeleteMixin, models.Model):
    ...
    # Update/Delete actions will write to log. Re-use your mixin as needed in as many models as needed.

你可以一次又一次地重复使用这个 mixin。根据需要执行翻译,在模型中设置一些属性并在 mixin 中检查它们。

【讨论】:

  • Ian,感谢您的回答和代码示例!我搜索了一下,发现 SOW question about mixins 证实了您的答案并得出结论,mixin 完全适合我的问题。
  • 很高兴它有帮助!如果你写了一个通用的方法来判断一个模型是否可翻译并采取相应的行动,我想你已经准备好了。 Django 的源代码很好地利用了 mixins/inheritance,仅出于这个原因就值得深入研究 :)
  • 嗨@IanPrice!抱歉发布了 necroposting,但不幸的是,当我从管理页面删除一个实例时,您的解决方案只对我部分有效——delete 钩子根本不起作用。它甚至没有进入那个方法:(虽然保存确实有效
  • Ad Alex,因为 delete 方法没有用于查询 (docs.djangoproject.com/en/dev/topics/db/models/…) 你可以通过使用信号来解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2017-12-03
  • 2011-07-09
  • 2010-12-16
  • 1970-01-01
相关资源
最近更新 更多