プロジェクトで django-guardian と django-rest-framework を正常に使用しています。ただし、特定の権限を持つ特定のユーザーのオブジェクトを取得する標準的な方法は、ユーザーが必要な権限セットを持つ何千ものオブジェクトを持っている場合、非常に時間がかかるように見えます。
IN
句に数千の ID を持つクエリが生成されます。これは、Web サーバーとデータベース サーバー間のネットワーク レイテンシを考慮すると、その後に影響を与えるようです。データベースから数千の ID を抽出し、それらを解析してから、IN
句でデータベースに送り返します。
これに対する文書化された回避策はありますか? get_objects_for_user
メソッドをハックしてobject_pk
列を整数に変更すると、インラインの select ステートメントで実行できました。
select ... from my_table where ... and id in (select id from guardian...
対現在の声明:
select id from guardian_userobjectpermissions where ...
... generate list of ids in python ...
select ... from my_table where ... and id in ([big list of ids])
私がまだ試していないさらなる回避策は、ガーディアンによってフェッチされる ID の範囲を何らかの形で縮小することです。たとえば、ユーザーは何千ものオブジェクトを持っていますが、私は過去 6 か月のオブジェクトにのみ関心があります。現時点では、ユーザーを何らかの方法で制限するのではなく、ユーザーの正しいアクセス許可を持つすべての可能なオブジェクト ID をフェッチします。