是否有方法在django中的每个INSERT / UPDATE / DELETE之前执行原始sql?

时间:2012-05-03 12:05:51

标签: django audit dml

我需要在db范围中设置变量,这将包含django用户id是什么使得DML查询。 像这样的东西:

CREATE OR REPLACE FUNCTION set_user_id(auser_id integer)
  RETURNS void AS
  'GD["user_id"] = auser_id'
  LANGUAGE plpythonu VOLATILE
  COST 100;

并在每个DML之前调用此函数以将该用户id传递给审计触发器; 是否有一种简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

如果您只需要对某些模型进行此操作,则应覆盖模型的save方法。

如果您需要这样做而不管正在使用的模型,但是访问您的特定数据库的任何模型,那么您应该通过为您的特定数据库调整一个来创建自己的db后端变体(在这种情况下,我怀疑它的postgresql)。

这样的事情应该这样做:

from django.db.backends.postgresql_psycopg2.base import *

class DatabaseWrapper(DatabaseWrapper):
    def _cursor(self):
        cursor = super(DatabaseWrapper, self)._cursor()
        q = " ... enter your query here ..."
        cursor.execute(q % (arg1,arg2))
        return cursor