사용자가 데이터베이스를 통해 사용자 지정 쿼리를 작성할 수있는 인터페이스를 제공하려고합니다. 나는 그들이 허용 된 기록만을 조회 할 수 있도록해야한다. 이를 위해 행렬 기반 액세스 제어를 django-guardian을 사용하여 적용하기로 결정했습니다.장고의 여러 모델에 대한 원시 쿼리 및 행 수준 액세스 제어
>>> 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')
이 나에게 검색어 세트를 제공합니다 : 여기
내 스키마는 다음과 같이 내가 get_objects_for_group를 사용할 수 있도록하고 싶습니다
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
처럼 보이는 방법이다. 위에서 정의한 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의 어떤 것을 집계해야하는 쿼리를 작성하지 않을 것입니다.
- 고객 당 별도의 테이블을 유지하면 이점이 있습니다.
실용적인 접근이라고 생각하십니까?
RawQuerySet에서 교차를 할 수 없다는 것을 확인했습니다. – ertan