python - example - ¿Cómo funciona la clase Meta de Django?
django models select field (4)
Extendiéndose en la respuesta Django de Tadeck anterior, el uso de la ''clase Meta:'' en Django también es normal en Python.
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). Mientras que en Django generalmente es de configuración de solo lectura, no hay nada que te impida cambiarlo:
In [1]: class Foo(object):
...: class Meta:
...: metaVal = 1
...:
In [2]: f1 = Foo()
In [3]: f2 = Foo()
In [4]: f1.Meta.metaVal
Out[4]: 1
In [5]: f2.Meta.metaVal = 2
In [6]: f1.Meta.metaVal
Out[6]: 2
In [7]: Foo.Meta.metaVal
Out[7]: 2
Puede explorarlo en Django directamente también, por ejemplo:
In [1]: from django.contrib.auth.models import User
In [2]: User.Meta
Out[2]: django.contrib.auth.models.Meta
In [3]: User.Meta.__dict__
Out[3]:
{''__doc__'': None,
''__module__'': ''django.contrib.auth.models'',
''abstract'': False,
''verbose_name'': <django.utils.functional.__proxy__ at 0x26a6610>,
''verbose_name_plural'': <django.utils.functional.__proxy__ at 0x26a6650>}
Sin embargo, en Django es más probable que desee explorar el atributo _meta
que es un objeto Options
creado por la metaclass
del modelo cuando se crea un modelo. Ahí es donde encontrarás 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 objeto _meta
Options
.
Estoy usando Django que permite a las personas agregar parámetros extra a una clase usando la 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 esto sea lo mismo.
La clase de Model
de Django maneja específicamente tener un atributo llamado Meta
que es una clase. No es una cosa general de Python.
Las metaclases de Python son completamente diferentes.
Las respuestas que afirman que el Meta
y las metaclases del modelo de Django son "completamente diferentes" son respuestas engañosas.
La construcción de los objetos de la clase modelo de Django (es decir, el objeto que representa la definición de la clase en sí; sí, las clases también son objetos) están de hecho controlados por una metaclase llamada ModelBase
, aquí puede ver ese código:
https://github.com/django/django/blob/master/django/db/models/base.py#L61
Y una de las cosas que hace ModelBase
es crear el atributo _meta
en cada modelo de Django que contiene maquinaria de validación, detalles de campo, maquinaria de almacenamiento, etc. Y, durante esta operación, todo lo que se especifica en la clase Meta
interna del modelo se lee y se usa dentro de ese proceso.
Entonces, mientras que sí, en cierto sentido, Meta
y metaclases son "cosas" diferentes, dentro de la mecánica de la construcción del modelo de Django están íntimamente relacionadas; entender cómo trabajan juntos profundizará su visión de ambos a la vez.
Esta podría ser una fuente útil de información para comprender mejor cómo los modelos de Django emplean metaclases.
https://code.djangoproject.com/wiki/DevModelCreation
Y esto también podría ser útil si quiere comprender mejor cómo funcionan los objetos en general.
Usted está haciendo una pregunta sobre dos cosas diferentes:
Meta
clase interna en modelos de Django :Este es solo un contenedor de clase con algunas opciones (metadatos) adjuntas al modelo. Define cosas como permisos disponibles, nombre de la tabla de la base de datos asociada, si el modelo es abstracto o no, versiones en singular y plural del nombre, etc.
Breve explicación está aquí: Django documentos: Modelos: Meta opciones
Lista de meta opciones disponibles aquí: Django docs: Model Meta options
Metaclass en Python :
La mejor descripción está aquí: ¿Qué es una metaclase en Python?