Ich versuche, allen meinen Django-Modellen mithilfe der Modellvererbung ein dynamisches Meta-Attribut hinzuzufügen, aber ich kann es nicht zum Laufen bringen. Ich habe eine Erlaubnis, die ich all meinen Modellen hinzufügen möchte:
%Vor%Ich habe versucht, eine abstrakte Basisklasse wie folgt zu erstellen:
%Vor% aber es funktioniert nicht. Ist das der richtige Ansatz? Da Django die Modellklassen mit Introspektion erstellt, bin ich mir nicht sicher, ob das Hinzufügen von Berechtigungen während der __init__()
der Klasse überhaupt funktioniert. Mit meiner aktuellen Implementierung hängt jedes Mal, wenn ich auf eine Modellinstanz zugreife, ein weiteres Tupel der Berechtigungen an.
Dein Instinkt ist richtig, dass das nicht funktionieren wird. In Django werden Berechtigungen in der Datenbank gespeichert, was bedeutet:
_meta.permissions
in __init__
hinzugefügt haben, würde das Objekt User
es in keiner Berechtigungsprüfung aufheben, da diese die Berechtigungstabelle in der DB (und einen Cache dieser Tabelle) konsultieren , bei dem). Was Sie eigentlich brauchen, ist eine Metaklasse ... Ihr Ziel kann nicht durch Vererbung erreicht werden. Die Metaklasse schreibt Ihre Klassendefinitionen ModelA
und ModelB
dynamisch neu, bevor sie definiert werden. Daher ist keine ModelA
-Instanz erforderlich, und sie ist für syncdb verfügbar. Da Djangos Modelle auch Metaklassen verwenden, um das Objekt Meta
zu erstellen, ist die einzige Voraussetzung, dass Ihre Metaklasse von derselben Metaklasse wie Djangos Modelle erben muss. Hier ist ein Beispielcode:
Beachten Sie, dass die Berechtigungen in diesem Fall nur für syncdb
geschrieben werden. Wenn Sie Berechtigungen dynamisch zur Laufzeit basierend auf dem Benutzer ändern müssen, sollten Sie Ihre eigenen Authentifizierungs-Backend .
Tags und Links django django-models