Ich verwende Django, mit dem Leute einer Klasse zusätzliche Parameter hinzufügen können, indem sie verwenden class Meta
.
class FooModel(models.Model):
...
class Meta:
...
Das einzige, was ich in Pythons Dokumentation gefunden habe, war:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
Ich denke jedoch nicht, dass dies dasselbe ist.
Antworten:
Sie stellen eine Frage zu zwei verschiedenen Dingen:
Meta
innere Klasse in Django-Modellen :Dies ist nur ein Klassencontainer mit einigen Optionen (Metadaten), die an das Modell angehängt sind. Es definiert Dinge wie verfügbare Berechtigungen, den Namen der zugehörigen Datenbanktabelle, ob das Modell abstrakt ist oder nicht, Singular- und Pluralversionen des Namens usw.
Eine kurze Erklärung finden Sie hier: Django-Dokumente: Modelle: Meta-Optionen
Eine Liste der verfügbaren Metaoptionen finden Sie hier: Django-Dokumente: Modell-Metaoptionen
Für die neueste Version von Django: Django docs: Model Meta options
Metaklasse in Python :
Die beste Beschreibung finden Sie hier: Was sind Metaklassen in Python?
quelle
Meta
Verhindert die innere Klasse von Django, dass Sie die integrierten Metaklassenfunktionen von Python verwenden können?In Anlehnung an Tadecks Django-Antwort oben ist die Verwendung von 'class Meta:' in Django auch nur normales Python.
Die interne Klasse ist ein praktischer Namespace für gemeinsam genutzte Daten zwischen den Klasseninstanzen (daher der Name Meta für 'Metadaten', aber Sie können ihn beliebig nennen). Während es in Django im Allgemeinen schreibgeschützt ist, gibt es nichts, was Sie daran hindert, es zu ändern:
Sie können es auch direkt in Django erkunden, zB:
In Django möchten Sie jedoch eher das
_meta
Attribut untersuchen, bei dem es sich um einOptions
Objekt handelt, das vom Modell erstellt wird,metaclass
wenn ein Modell erstellt wird. Hier finden Sie alle Meta-Informationen der Django-Klasse. In DjangoMeta
wird nur verwendet, um Informationen in den Prozess der Erstellung des_meta
Options
Objekts zu übergeben.quelle
MyUser.objects.get(pk=1)._meta
type(MyUser.objects.get(pk=1)).Meta
Die
Model
Klasse von Django behandelt speziell das AttributMeta
das eine Klasse ist. Es ist keine allgemeine Python-Sache.Python-Metaklassen sind völlig anders.
quelle
Meta
Unterricht funktioniert? Ich glaube, OP hat speziell danach gefragt.Antworten, die Django-Modelle beanspruchen
Meta
und Metaklassen seien "völlig unterschiedlich", sind irreführende Antworten.Die Konstruktion von Django Modell Klassenobjekten (das das Objekt zu sagen ist , die für die Klassendefinition steht selbst, ja, Klassen werden auch Objekte) sind in der Tat von einem metaclass gesteuert genannt
ModelBase
, können Sie diesen Code hier sehen:https://github.com/django/django/blob/master/django/db/models/base.py#L61
Und eines der Dinge,
ModelBase
die Sie_meta
tun müssen, ist, das Attribut für jedes Django-Modell zu erstellen, das Validierungsmaschinerie, Felddetails, Speicherlogik usw. enthält. Während dieses Vorgangs das Material, das im Inneren des Modells angegeben istMeta
Klasse gelesen und in diesem Prozess verwendet.Während ja, in
Meta
gewissem Sinne und Metaklassen unterschiedliche „Dinge“ sind, sind sie innerhalb der Mechanik des Django-Modellbaus eng miteinander verbunden. Wenn Sie verstehen, wie sie zusammenarbeiten, vertiefen Sie Ihren Einblick in beide gleichzeitig.Dies könnte eine hilfreiche Informationsquelle sein, um besser zu verstehen, wie Django-Modelle Metaklassen verwenden.
https://code.djangoproject.com/wiki/DevModelCreation
Dies kann auch hilfreich sein, wenn Sie besser verstehen möchten, wie Objekte im Allgemeinen funktionieren.
https://docs.python.org/3/reference/datamodel.html
quelle
Dokument der inneren Metaklasse Dieses Dokument der Metadaten des Django-Modells ist „alles, was kein Feld ist“, z. B. Bestelloptionen (Reihenfolge), Name der Datenbanktabelle (db_table) oder lesbare Singular- und Pluralnamen (Verbose_name und Verbose_name_plural). Es sind keine erforderlich, und das Hinzufügen der Klasse Meta zu einem Modell ist völlig optional. https://docs.djangoproject.com/de/dev/topics/db/models/#meta-options
quelle
In Django fungiert es als Konfigurationsklasse und speichert die Konfigurationsdaten an einem Ort !!
quelle