Obtener el nombre de clase del modelo de django


107

Tengo un modelo de django:

class Book(models.Model):
  [..]

y quiero tener el nombre del modelo como cadena: 'Libro'. Cuando trato de hacerlo de esta manera:

Book.__class__.__name__

devuelve 'ModelBase'.

¿Alguna idea?

Respuestas:


153

Prueba Book.__name__.

Los modelos de Django se derivan de ModelBase, que es la Metaclase para todos los modelos.


49

En lugar de hacerlo Book.__class__.__name__en la clase en sí, si lo hace sobre un objeto de libro, book_object.__class__.__name__le dará 'Libro' (es decir, el nombre del modelo)


1
Este me ayudó en mi caso. Fusioné 2 conjuntos de consultas que son de diferentes modelos. En un bucle, necesitaba obtener el nombre de clase del objeto cuando estoy iterando.
Peter

Peter, ¿cómo fusionaste dos conjuntos de consultas? ¿O el conjunto combinado es solo una lista de instancias de modelo? Gracias
little_birdie

38

Como sugiere la respuesta anterior , puede usarstr(Book._meta) .

Esta pregunta es bastante antigua, pero encontré la siguiente útil (probada en Django 1.11, pero podría funcionar en versiones anteriores ...), ya que también puede tener el mismo nombre de modelo de varias aplicaciones.

Suponiendo que Book está en my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
Esta debería ser la respuesta aceptada para las versiones más nuevas de Django.
Bobort

Tienes razón @Bobort, también está funcionando en la versión de Django 2.2.3.
Kushan Gunasekera

8

Obtuve el nombre de la clase usando

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase

Gracias; str(self.model._meta)es lo que estaba buscando; en cuanto al otro, dame la clase de padres.
ppython

Si desea algo más implícito que una llamada a una cadena, puede obtener lo mismo (probado en Django 1.11) con: Book._meta.object_nameo Book._meta.model_name. A continuación, si desea que el nombre de la aplicación, así, que es accesible a través deBook._meta.app_label
Geekfish

4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

De esta manera, siempre que llame book.class_name()al código Python (también en la plantilla {{book.class_name}}), devolverá el nombre de la clase que es 'Libro'.


3

También puede recuperar el nombre del modelo de la clase Meta del modelo. Esto funciona en la clase de modelo en sí, así como en cualquier instancia de ella:

# Model definition
class Book(models.Model):
    # fields...

    class Meta:
        verbose_name = 'book'
        verbose_name_plural = 'books'


# Get some model
book = Book.objects.first()

# Get the model name
book._meta.verbose_name

Configuración verbose_namey verbose_name_plurales opcional. Django inferirá estos valores del nombre de la clase del modelo (es posible que haya notado el uso de esos valores en el sitio de administración).

https://docs.djangoproject.com/en/3.0/ref/models/options/#verbose-name

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.