135 votes

Obtenir le nom de la classe du modèle Django

J'ai un modèle Django:

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

et je veux avoir le nom du modèle en tant que chaîne de caractères : 'Book'. Quand j'essaie de l'obtenir de cette façon :

Book.__class__.__name__

ça renvoie 'ModelBase'.

Des idées ?

184voto

miku Points 63392

Essayez Book.__name__.

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

68voto

vijay shanker Points 395

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

1 votes

Cela m'a aidé dans mon cas. J'ai fusionné 2 querysets qui sont de modèles différents. Dans une boucle, j'avais besoin d'obtenir le nom de la classe de l'objet lorsque je itère.

0 votes

Peter, comment avez-vous fusionné deux querysets? Ou est-ce que l'ensemble fusionné n'est qu'une liste d'instances de modèle? Merci

65voto

Geekfish Points 1796

Comme suggéré par la 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 cela pourrait fonctionner sur des versions plus anciennes...), car vous pouvez également avoir le même nom de modèle provenant de plusieurs applications.

En supposant que Book soit dans my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

5 votes

Cela devrait être la réponse acceptée pour les nouvelles versions de Django.

0 votes

Vous avez raison @Bobort, cela fonctionne également sur la version de Django 2.2.3.

0 votes

C'est exactement ce dont j'avais besoin. Cela fonctionne pour les deux le modèle/la classe elle-même et une instance du modèle.

8voto

J'ai obtenu le nom de la classe en utilisant,

str(Book._meta)

Book.__class__.__name__  -> cela vous donnera le ModelBase

0 votes

Merci; str(self.model._meta) est ce que je cherchais; quant à l'autre, donnez-moi la classe parent.

0 votes

Si vous voulez quelque chose de plus implicite qu'un appel à chaîne, alors vous pouvez obtenir la même chose (essayé sur Django 1.11) avec: Book._meta.object_name ou Book._meta.model_name. Ensuite, si vous voulez également le nom de l'application, cela est accessible via Book._meta.app_label

6voto

Brkyrn Points 189
classe Livre(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

Avec cette méthode, chaque fois que vous appelez book.class_name() dans le code python (également dans le template {{book.class_name}}), cela renverra le nom de la classe qui est 'Livre'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X