我正在尝试为用户提供一个界面,以便在数据库上编写自定义查询。我需要确保他们只能查询他们被允许的记录。为了做到这一点,我决定使用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')
这给了我一个查询集。我可以使用上面定义的 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'))
这种方法有意义吗?有没有更好的方法来解决这个问题?
谢谢!
编辑:
解决该问题的另一种方法可能是为每个用户创建一个单独的表。我了解这可能会增加我的应用程序的复杂性,但是:
- 用户数长期不会超过100s。不是消费者应用程序。
- 根据我们的用例,我不太可能需要跨这些表进行查询。我不会编写需要从 table1、table2、table3 聚合属于同一模型的任何内容的查询。
- 为每个客户维护一个单独的表可能具有优势。
您认为这是一种可行的方法吗?