Tôi đang cố gắng cung cấp giao diện cho người dùng ghi các truy vấn tùy chỉnh trên cơ sở dữ liệu. Tôi cần đảm bảo rằng họ chỉ có thể truy vấn các hồ sơ mà họ được phép. Để thực hiện điều đó, tôi quyết định áp dụng điều khiển truy cập dựa trên hàng bằng cách sử dụng django-guardian.Kiểm soát quyền truy cập và kiểm soát cấp hàng nguyên qua nhiều mô hình trong Django
Sau đây là cách schemas của tôi trông giống như
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
Tôi muốn để có thể sử dụng get_objects_for_group như sau:
>>> 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')
này mang lại cho tôi một QuerySet. Tôi có thể sử dụng BaseClass mà tôi đã định nghĩa ở trên và viết truy vấn thô lên các lớp liên quan khác không?
>>> 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'))
Phương pháp này có hợp lý không? Có cách nào tốt hơn để giải quyết vấn đề này không?
Cảm ơn!
Edit:
Một cách khác để giải quyết vấn đề có thể được tạo ra một bảng riêng biệt cho mỗi người dùng. Tôi hiểu sự phức tạp mà điều này có thể thêm vào đơn đăng ký của tôi nhưng:
- Số lượng người dùng sẽ không quá 100 trong một thời gian dài. Không phải là một ứng dụng tiêu dùng.
- Mỗi trường hợp sử dụng của chúng tôi, tôi không cần phải truy vấn qua các bảng này. Tôi sẽ không viết một truy vấn mà cần phải tổng hợp bất cứ điều gì từ table1, table2, table3 thuộc về cùng một mô hình.
- Việc duy trì một bảng riêng biệt cho mỗi khách hàng có thể có lợi thế.
Bạn có nghĩ đây là phương pháp khả thi không?
Chỉ cần xác thực rằng tôi không thể thực hiện giao lộ trên RawQuerySet. – ertan