Ich versuche, eine Schnittstelle für den Benutzer zum Schreiben von benutzerdefinierten Abfragen über die Datenbank bereitzustellen. Ich muss sicherstellen, dass sie nur die Datensätze abfragen können, die ihnen erlaubt sind. Um dies zu tun, entschied ich mich für die zeilenbasierte Zugriffskontrolle mit django-guardian.Raw Abfrage und Zeilenzugriffssteuerung über mehrere Modelle in Django
Hier ist, wie meine Schemata aussehen
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
würde ich in der Lage sein mag get_objects_for_group wie folgt zu verwenden:
>>> 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')
Das gibt mir eine QuerySet. Kann ich die BaseClass verwenden, die ich oben definiert habe, und eine rohe Abfrage über andere verwandte Klassen schreiben?
>>> 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'))
Macht dieser Ansatz Sinn? Gibt es einen besseren Weg, dieses Problem anzugehen?
Danke!
Edit:
Eine andere Möglichkeit, das Problem zu bewältigen könnte eine separate Tabelle für jeden Benutzer werden zu schaffen. Ich verstehe die Komplexität, die dies zu meiner Anwendung hinzufügen könnte, aber:
- Die Anzahl der Benutzer wird nicht mehr als 100s für eine lange Zeit sein. Keine Verbraucheranwendung.
- Für unseren Anwendungsfall ist es ziemlich unwahrscheinlich, dass ich quer über diese Tabellen abfragen muss. Ich werde keine Abfrage schreiben, die irgendetwas aus table1, table2, table3 aggregieren muss, das zu demselben Modell gehört.
- Die Beibehaltung einer separaten Tabelle pro Kunde kann von Vorteil sein.
Denken Sie, dass dies ein praktikabler Ansatz ist?
Nur bestätigt, dass ich keine Schnittmenge auf RawQuerySet tun kann. – ertan