2012-05-03 8 views
0

dbスコープに変数を設定する必要があります。これはdjangoユーザIDを含むもので、DMLクエリを作成するものです。このような 何か:djangoのすべてのINSERT/UPDATE/DELETEの前にraw SQLを実行する方法はありますか?

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

EVERY挿入/更新する前に/削除しますか?知りません。しかし、あなたのモデルのために、おそらくそれが助けることができるシグナルをhttps://docs.djangoproject.com/en/dev/topics/signals/作成することができますか? – dm03514

+0

はい、すべてのDMLの前に、私はミドルウェアでそれを扱うことができると思うし、リクエストメドンが投稿/削除/入力されている場合はユーザーIDを設定してください –

答えて

0

特定のモデルでのみ実行する必要がある場合は、モデルのsaveメソッドを上書きする必要があります。

使用しているモデルに関係なく、特定のデータベースにアクセスするすべてのモデルでこの作業を行う必要がある場合は、データベースバックエンドの独自のバリアントを作成する必要があります(この場合は、私はその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 
+0

回答ありがとう、Burhan Khalid。しかし、この場合、どのようにしてDMLリクエストを実行するのかユーザーに関する情報を得ることができますか?私はこれを行う要求オブジェクトが必要です。私はミドルウェアでそれを行うことができます。しかし、この場合、私は接続安全な変数が必要です。私のケースでは、plpythonのGDです。悪い考えです。しかし、djangoはdb-connectionを要求終了後にクローズします。 –

関連する問題