ユーザーがデータベースに対してカスタム クエリを作成するためのインターフェイスを提供しようとしています。許可されているレコードのみをクエリできるようにする必要があります。そのために、 django-guardianを使用して行ベースのアクセス制御を適用することにしました。
これが私のスキーマの外観です
class BaseClass(models.Model):
somefield = models.TextField()
class Meta:
permissions = (
('view_record', 'View record'),
)
class ClassA(BaseClass):
# some other fields here
classb = models.ForeignKey(ClassB)
class ClassB(BaseClass):
# some fields here
classc = models.ForeignKey(ClassC)
class ClassC(BaseClass):
# some fields here
次のようにget_objects_for_groupを使用できるようにしたいと思います。
>>> group = Group.objects.create('some group')
>>> class_c = ClassC.objects.create('ClassC')
>>> class_b = ClassB.objects.create('ClassB', classc=class_c)
>>> class_a = ClassA.objects.create('ClassA', classb=class_b)
>>> assign_perm('view_record', group, class_c)
>>> assign_perm('view_record', group, class_b)
>>> assign_perm('view_record', group, class_a)
>>> get_objects_for_group(group, 'view_record')
これにより、QuerySet が得られます。上記で定義した BaseClass を使用して、他の関連クラスに対して生のクエリを作成できますか?
>>> qs.intersection(get_objects_for_group(group, 'view_record'), \
BaseClass.objects.raw('select * from table_a a'
'join table_b b on a.id=b.table_a_id '
'join table_c c on b.id=c.table_b_id '
'where some conditions here'))
このアプローチは理にかなっていますか?この問題に取り組むためのより良い方法はありますか?
ありがとう!
編集:
この問題に対処する別の方法は、ユーザーごとに個別のテーブルを作成することです。これによりアプリケーションが複雑になる可能性があることは理解していますが、
- ユーザー数は長期的には 100 人を超えることはありません。消費者向けアプリケーションではありません。
- 私たちのユースケースによると、これらのテーブル全体でクエリを実行する必要がある可能性はほとんどありません。同じモデルに属する table1、table2、table3 から何かを集計する必要があるクエリは記述しません。
- 顧客ごとに個別のテーブルを維持することには利点があります。
これは実行可能なアプローチだと思いますか?