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?

Schneck
fuente

Respuestas:

153

Prueba Book.__name__.

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

miku
fuente
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)

vijay shanker
fuente
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
Friki
fuente
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
Mohideen bin Mohammed
fuente
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'.

Brkyrn
fuente
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

León
fuente