Używam Django, który pozwala ludziom dodawać dodatkowe parametry do klasy za pomocą class Meta
.
class FooModel(models.Model):
...
class Meta:
...
Jedyne, co znalazłem w dokumentacji Pythona, to:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
Jednak nie sądzę, że to jest to samo.
Odpowiedzi:
Zadajesz pytanie o dwie różne rzeczy:
Meta
klasa wewnętrzna w modelach Django :To tylko kontener klasy z kilkoma opcjami (metadanymi) dołączonymi do modelu. Definiuje takie rzeczy, jak dostępne uprawnienia, powiązana nazwa tabeli bazy danych, czy model jest abstrakcyjny czy nie, pojedyncze i mnogie wersje nazwy itp.
Krótkie wyjaśnienie jest tutaj: Dokumenty Django: Modele: Opcje Meta
Lista dostępnych opcji meta jest tutaj: Dokumenty Django: Opcje Meta modelu
Najnowsza wersja Django: Django docs: Model Meta options
Metaklasa w Pythonie :
Najlepszy opis znajduje się tutaj: Co to są metaklasy w Pythonie?
źródło
Meta
wewnętrzna klasa Django uniemożliwia korzystanie z wbudowanych funkcji metaklasy Pythona?Rozszerzając powyższą odpowiedź Django Tadecka, użycie „class Meta:” w Django jest również zwykłym Pythonem.
Klasa wewnętrzna jest wygodną przestrzenią nazw dla współużytkowanych danych między instancjami klasy (stąd nazwa Meta dla „metadanych”, ale można ją nazwać jak tylko zechcesz). Podczas gdy w Django jest to konfiguracja tylko do odczytu, nic nie stoi na przeszkodzie, abyś ją zmienił:
Możesz to również zbadać bezpośrednio w Django, np .:
Jednak w Django chętniej eksplorujesz
_meta
atrybut, którym jestOptions
obiekt tworzony przez modelmetaclass
podczas tworzenia modelu. W tym miejscu znajdziesz wszystkie informacje „meta” klasy Django. W DjangoMeta
służy tylko do przekazywania informacji do procesu tworzenia_meta
Options
obiektu.źródło
MyUser.objects.get(pk=1)._meta
type(MyUser.objects.get(pk=1)).Meta
Model
Klasa Django obsługuje konkretnie atrybuty o nazwieMeta
klasa. To nie jest ogólna kwestia Python.Metaklasy Pythona są zupełnie inne.
źródło
Meta
klasy? Uważam, że OP zapytał konkretnie o to.Odpowiedzi, które twierdzą, że model Django
Meta
i metaklasy są „zupełnie inne”, są mylącymi odpowiedziami.Konstrukcja obiektów klasy modelu Django (to znaczy obiektu, który oznacza samą definicję klasy; tak, klasy są również obiektami) jest rzeczywiście kontrolowana przez metaklasę o nazwie
ModelBase
, możesz zobaczyć ten kod tutaj:https://github.com/django/django/blob/master/django/db/models/base.py#L61
Jedną z rzeczy, które
ModelBase
to robi, jest utworzenie_meta
atrybutu na każdym modelu Django, który zawiera maszynę do sprawdzania poprawności, szczegóły pola, logikę składowania i tak dalej. Podczas tej operacji elementy określone w wewnętrznejMeta
klasie modelu są odczytywane i wykorzystywane w tym procesie.A więc w pewnym sensie tak
Meta
metaklasy są różnymi „rzeczami”, w mechanice konstrukcji modelu Django są one ściśle powiązane; zrozumienie, jak one działają razem, pogłębi twój wgląd w oba naraz.Może to być pomocne źródło informacji, aby lepiej zrozumieć, w jaki sposób modele Django wykorzystują metaklasy.
https://code.djangoproject.com/wiki/DevModelCreation
Może to również pomóc, jeśli chcesz lepiej zrozumieć, jak ogólnie działają obiekty.
https://docs.python.org/3/reference/datamodel.html
źródło
Dokument wewnętrznej klasy meta Ten dokument metadanych Modelu django to „wszystko, co nie jest polem”, takie jak opcje zamawiania (zamawianie), nazwa tabeli bazy danych (tablica_db) lub czytelne dla człowieka nazwy w liczbie pojedynczej i mnogiej (nazwa_grubna i nazwa_grubna). Żadne nie są wymagane, a dodanie klasy Meta do modelu jest całkowicie opcjonalne. https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options
źródło
W Django działa jak klasa konfiguracyjna i utrzymuje dane konfiguracyjne w jednym miejscu !!
źródło