在django中,是否有方法在每次插入/更新/删除之前执行原始sql?
我需要在db范围内设置变量,该变量将包含django用户id,并进行DML查询。 大概是这样的:在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传递到审核触发器中; 有没有一种简单的方法可以做到这一点?如果您
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连接,即我将其删除,完成。