Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中,是否有方法在每次插入/更新/删除之前执行原始sql?_Django_Audit_Dml - Fatal编程技术网

在django中,是否有方法在每次插入/更新/删除之前执行原始sql?

在django中,是否有方法在每次插入/更新/删除之前执行原始sql?,django,audit,dml,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传递到审核触发器中; 有没有一种简单的方法可以做到这一点?如果您

我需要在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传递到审核触发器中;
有没有一种简单的方法可以做到这一点?

如果您只需要对某些模型执行此操作,那么您应该覆盖模型的方法


如果您需要在不考虑正在使用的模型的情况下执行此操作,但需要跨访问特定数据库的任何模型执行此操作,那么您应该通过为特定数据库调整一个数据库后端来创建自己的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

在每次插入/更新/删除之前?我不知道。但对于你的模型,你可以创建信号,也许这会有所帮助?是的,在每个DML之前;我想我可以在中间件中处理它,如果请求方法是post/delete/putThank you for answer,我可以设置用户id,Burhan Khalid。但在这种情况下,我如何获得有关执行DML请求的用户的任何信息?我需要请求对象来执行此操作。我可以用中间件来做。但在这种情况下,我需要连接安全变量,在我的例子中是plpython的GD,这是个坏主意。但django在请求后关闭db连接,即我将其删除,完成。