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?

Respostas:


153

Experimente Book.__name__.

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


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)


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

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

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.