Obter o nome da classe do modelo django

107

Eu tenho um modelo django:

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

e quero ter o nome do modelo como string: 'Livro'. Quando tento fazer desta forma:

Book.__class__.__name__

ele retorna 'ModelBase'.

Qualquer ideia?

schneck
fonte

Respostas:

153

Experimente Book.__name__.

Os modelos Django são derivados do ModelBase, que é a Metaclass para todos os modelos.

Miku
fonte
49

Em vez de fazer Book.__class__.__name__na própria classe, se você fizer isso sobre um objeto de livro, book_object.__class__.__name__você receberá 'Livro' (ou seja, o nome do modelo)

Shanker Vijay
fonte
1
Este me ajudou no meu caso. Eu combinei 2 querysets que são de modelos diferentes. Em um loop, eu precisava obter o nome da classe do objeto quando estou iterando.
Peter
Peter, como você mesclou dois querysets ?? Ou o conjunto mesclado é apenas uma lista de instâncias do modelo ?? Obrigado
little_birdie
38

Conforme sugerido pela resposta acima , você pode usar str(Book._meta).

Esta pergunta é bastante antiga, mas achei a seguinte útil (testado no Django 1.11, mas pode funcionar em mais antigos ...), já que você também pode ter o mesmo nome de modelo em vários aplicativos.

Supondo que o livro esteja em my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app
Geekfish
fonte
2
Esta deve ser a resposta aceita para versões mais recentes do Django.
Bobort
Você está correto, @Bobort, está funcionando na versão Django 2.2.3também.
Kushan Gunasekera
8

Consegui o nome da classe usando,

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase
Mohideen bin Mohammed
fonte
Obrigado; str(self.model._meta)é o que eu estava procurando; quanto ao outro, dê-me a classe dos pais.
ppython
Se você quiser algo mais implícito do que uma chamada a string, você pode obter o mesmo (experimentado no Django 1.11) com: Book._meta.object_nameou Book._meta.model_name. Então, se você quiser o nome do aplicativo também, pode ser acessado viaBook._meta.app_label
Geekfish
4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

Dessa forma, sempre que você chamar o book.class_name()código python (também no modelo {{book.class_name}}), ele retornará o nome da classe que é 'Livro'.

Brkyrn
fonte
3

Você também pode recuperar o nome do modelo da classe Meta do modelo. Isso funciona na própria classe de modelo, bem como em qualquer instância dela:

# 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

Configuração verbose_namee verbose_name_pluralé opcional. Django inferirá esses valores a partir do nome da classe do modelo (você deve ter notado o uso desses valores no site de administração).

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

Leo
fonte