Dynamische Meta-Attribute für Django-Modelle?

8

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.

    
user27478 07.04.2009, 14:07
quelle

2 Antworten

23

Dein Instinkt ist richtig, dass das nicht funktionieren wird. In Django werden Berechtigungen in der Datenbank gespeichert, was bedeutet:

  • Sie müssen auf Klassenebene verfügbar sein, wenn syncdb ausgeführt wird, um die auth_permission-Tabelle zu füllen (und Ihr Ansatz erfordert eine Instanz, die während der syncdb nicht erstellt wird)
  • selbst wenn Sie es zu _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:

%Vor%

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 .

    
Jarret Hardie 07.04.2009, 23:15
quelle
0

Versuchen Sie, einen benutzerdefinierten Manager zu verwenden:

%Vor%

verwende so:

%Vor%     
rexus 25.02.2010 12:40
quelle

Tags und Links