Estoy usando Django que permite a las personas agregar parámetros adicionales a una clase mediante el uso class Meta
.
class FooModel(models.Model):
...
class Meta:
...
Lo único que encontré en la documentación de Python fue:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
Sin embargo, no creo que sea lo mismo.
Respuestas:
Estás haciendo una pregunta sobre dos cosas diferentes:
Meta
clase interna en modelos Django :Esto es solo un contenedor de clase con algunas opciones (metadatos) adjuntas al modelo. Define cosas como los permisos disponibles, el nombre de la tabla de la base de datos asociada, si el modelo es abstracto o no, las versiones en singular y plural del nombre, etc.
Breve explicación está aquí: Django docs: Modelos: Meta opciones
La lista de meta opciones disponibles está aquí: Django docs: Model Meta options
Para la última versión de Django: Django docs: Model Meta options
Metaclase en Python :
La mejor descripción está aquí: ¿Qué son las metaclases en Python?
fuente
Meta
clase interna de Django le impide usar las funciones integradas de metaclase de Python?Extendiendo la respuesta anterior de Tadeck a Django, el uso de 'clase Meta:' en Django también es Python normal.
La clase interna es un espacio de nombres conveniente para los datos compartidos entre las instancias de la clase (de ahí el nombre Meta para 'metadatos' pero puede llamarlo como quiera). Si bien en Django generalmente se trata de configuraciones de solo lectura, no hay nada que lo detenga para cambiarlo:
También puede explorarlo en Django directamente, por ejemplo:
Sin embargo, en Django es más probable que desee explorar el
_meta
atributo que es unOptions
objeto creado por el modelometaclass
cuando se crea un modelo. Ahí es donde encontrará toda la información 'meta' de la clase Django. En Django,Meta
solo se usa para pasar información al proceso de creación del_meta
Options
objeto.fuente
MyUser.objects.get(pk=1)._meta
type(MyUser.objects.get(pk=1)).Meta
La
Model
clase de Django maneja específicamente tener un atributo llamadoMeta
que es una clase. No es una cosa general de Python.Las metaclases de Python son completamente diferentes.
fuente
Meta
funciona la clase? Creo que OP preguntó específicamente sobre eso.Las respuestas que afirman que el modelo
Meta
y las metaclases de Django son "completamente diferentes" son respuestas engañosas.La construcción de los objetos de clase modelo de Django (es decir, el objeto que representa la definición de clase en sí; sí, las clases también son objetos) de hecho están controlados por una metaclase llamada
ModelBase
, puede ver ese código aquí:https://github.com/django/django/blob/master/django/db/models/base.py#L61
Y una de las cosas que
ModelBase
hace es crear el_meta
atributo en cada modelo de Django que contiene maquinaria de validación, detalles de campo, lógica de guardado, etc. Durante esta operación, las cosas que se especifican en laMeta
clase interna del modelo se leen y usan dentro de ese proceso.Entonces, aunque sí, en cierto sentido
Meta
y las metaclases son 'cosas' diferentes, dentro de la mecánica de la construcción del modelo Django están íntimamente relacionadas; Comprender cómo funcionan juntos profundizará su comprensión de ambos a la vez.Esta podría ser una fuente útil de información para comprender mejor cómo los modelos Django emplean metaclases.
https://code.djangoproject.com/wiki/DevModelCreation
Y esto también podría ayudar si desea comprender mejor cómo funcionan los objetos en general.
https://docs.python.org/3/reference/datamodel.html
fuente
Documento interno de metaclases Este documento de metadatos del modelo django es "cualquier cosa que no sea un campo", como las opciones de pedido (pedido), el nombre de la tabla de la base de datos (db_table) o los nombres en singular y plural legibles por humanos (verbose_name y verbose_name_plural). No se requiere ninguno, y agregar la clase Meta a un modelo es completamente opcional. https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options
fuente
¡En Django, actúa como una clase de configuración y mantiene los datos de configuración en un solo lugar!
fuente