¿Cómo funciona la clase Meta anidada de Django?

6 minutos de lectura

avatar de usuario
miki725

Estoy usando Django, que permite a las personas agregar parámetros adicionales a una clase usando 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.

  • El título pregunta sobre Python meta, pero la pregunta parece preguntar sobre Django meta: ¿sobre cuál estás preguntando?

    – ckhan

    27 de abril de 2012 a las 3:01

  • @ckhan está confundido debido a la decisión absurda (IMO) de llamar a una clase anidada “Meta”, lo cual es muy engañoso; a los principiantes, sobre las metaclases de Python, y a los usuarios más experimentados que nunca lo han visto, sobre su propósito a priori (en lugar de usar atributos de clase o metaclases reales)

    usuario4396006

    3 de febrero de 2019 a las 22:20

avatar de usuario
Tadeck

Estás haciendo una pregunta sobre dos cosas diferentes:

  1. Meta clase interna en modelos Django:

    Este es solo un contenedor de clase con algunas opciones (metadatos) adjuntas al modelo. Define cosas tales como los permisos disponibles, el nombre de la tabla de la base de datos asociada, si el modelo es abstracto o no, las versiones singular y plural del nombre, etc.

    Breve explicación está aquí: Django docs: Modelos: Metaopciones

    La lista de meta opciones disponibles está aquí: Documentos de Django: opciones de metadatos del modelo

    Para la última versión de Django: Documentos de Django: opciones de metadatos del modelo

  2. Metaclase en Python:

    La mejor descripción está aquí: ¿Qué son las metaclases en Python?

  • ¿Están estas dos cosas relacionadas en absoluto? es decir, Django’s Meta ¿La clase interna le impide usar las funciones de metaclase integradas de Python?

    – nyby

    03/03/2015 a las 20:00


  • @nnyby: Hay dos cosas que crean una relación entre estos dos conceptos: el nombre y la confusión que tienen muchos usuarios (como lo tenía OP en la pregunta original). Creo que abordar esa confusión común es una ventaja significativa de este tema. ¿No estás de acuerdo?

    – Tadeck

    03/03/2015 a las 23:31

  • ¿Qué es “un contenedor de clase”? pensé que entendía clase y tipos de datos de contenedor en Python, pero no entiendo cuál es el concepto de “contenedor de clase” que mencionas.

    – papa tonto

    5 de junio a las 8:31


avatar de usuario
Paul Whipp

Ampliando la respuesta Django de Tadeck anterior, 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). Mientras que en Django es generalmente material de configuración de solo lectura, no hay nada que le 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

También puede explorarlo directamente en Django, 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 _meta atributo que es un Options objeto creado por el modelo metaclass cuando se crea un modelo. Ahí es donde encontrará toda la información ‘meta’ de la clase Django. En Django, Meta solo se utiliza para pasar información al proceso de creación del _meta Options objeto.

  • Esto no funciona en modelos definidos por el usuario: >>>from myapp.models import MyModel >>>MyModel.Meta Traceback (última llamada más reciente): Archivo ““, línea 1, en AttributeError: tipo de objeto ‘MyModel’ no tiene atributo ‘meta’

    – bdf

    11 de diciembre de 2015 a las 17:58


  • Necesitas el guión bajo, por ejemplo MyUser.objects.get(pk=1)._meta

    –Paul Whipp

    13 de diciembre de 2015 a las 18:51

  • Correcto, pero eso no accede a la clase Meta interna de la clase Model. Eso accede a las opciones _meta para la instancia de ese Modelo… no parece haber una forma de acceder a la clase Meta interna en sí. El caso de uso para mí fue subclasificar una clase proxy MyModelProxy de MyModel de una manera en la que MyModelProxy puede heredar la clase Meta interna de MyModel.

    – bdf

    14 de diciembre de 2015 a las 17:17

  • No tengo del todo claro lo que quiere decir con la ‘clase Meta interna’ del modelo, pero siempre puede trabajar directamente con la clase de la instancia, por ejemplo type(MyUser.objects.get(pk=1)).Meta

    –Paul Whipp

    15 de diciembre de 2015 a las 19:07


  • “espacio de nombres conveniente para datos compartidos entre las instancias de clase” Esa línea lo hizo por mí.

    – Pop

    14/11/2016 a las 21:19

de Django Model clase 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.

  • Creo que su respuesta no es lo suficientemente clara. ¿Podría dar más detalles sobre cómo Meta trabajos de clase? Creo que OP preguntó específicamente sobre eso.

    – Tadeck

    27 de abril de 2012 a las 3:09

avatar de usuario
jhrr

Respuestas que reclaman el modelo de Django. Meta y las metaclases son “completamente diferentes” son respuestas engañosas.

La construcción del modelo Django. objetos de clasees decir, el objeto que representa la definición de clase en sí (sí, las clases también son objetos), están controlados por una metaclase llamada ModelBasey tu puedes ver ese código aquí.

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, guardar lógica, etc. Durante esta operación, las cosas que se especifican en el interior del modelo Meta La clase se lee y se usa dentro de ese proceso.

Entonces, aunque sí, en cierto sentido Meta y las metaclases son ‘cosas’ diferentes, dentro de la mecánica de 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 de información útil para comprender mejor cómo los modelos de Django emplean las 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

avatar de usuario
Sujeet

Documento de metaclase interno:

este documento de django
Los metadatos del modelo son “cualquier cosa que no sea un campo”, como las opciones de pedido. (ordering), database table name (db_table), or human-readable singular and plural names (verbose_name and 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

avatar de usuario
Rishi Chabra

¡¡En Django, actúa como una clase de configuración y mantiene los datos de configuración en un solo lugar!!

Clase Meta es el lugar en la lógica de su código donde su modelo.campos REUNIR Con tu formulario.widgets. Entonces, en Class Meta(), crea el enlace entre los campos de su modelo y los diferentes widgets que desea tener en su formulario.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad