false example español python django metaclass

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.

https://docs.python.org/3/reference/datamodel.html


Usted está haciendo una pregunta sobre dos cosas diferentes:

  1. 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

  2. Metaclass en Python :

    La mejor descripción está aquí: ¿Qué es una metaclase en Python?