web-dev-qa-db-fra.com

Récupère le nom de classe de Django model

J'ai un modèle Django:

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

et je veux avoir le nom du modèle sous forme de chaîne: 'Book'. Quand j'essaye de l'obtenir de cette façon:

Book.__class__.__name__

il renvoie 'ModelBase'.

Une idée?

93
schneck

Essayez Book.__name__.

Les modèles Django sont dérivés du ModelBase, qui est la métaclasse pour tous les modèles.

126
miku

Au lieu de faire Book.__class__.__name__ sur la classe elle-même, si vous le faites sur un objet livre, alors book_object.__class__.__name__ vous donnera "Livre" (c'est-à-dire le nom du modèle)

44
vijay shanker

Comme suggéré par le réponse ci-dessus , vous pouvez utiliser str(Book._meta).

Cette question est assez ancienne, mais j'ai trouvé ce qui suit utile (testé sur Django 1.11, mais pourrait fonctionner sur des versions plus anciennes ...), car vous pouvez également avoir le même nom de modèle à partir de plusieurs applications.

En supposant que le livre est dans my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app
24
Geekfish

J'ai obtenu le nom de classe en utilisant,

str(Book._meta)

Book.__class__.__ -> this will give you the ModelBase
8
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

De cette façon, chaque fois que vous appelez book.class_name() dans python (également dans le modèle {{book.class_name}}), Il renverra le nom de la classe qui est 'Book'.

2
Brkyrn