Récupère le nom de classe du modèle django

107

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?

schneck
la source

Réponses:

153

Essayez Book.__name__.

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

Miku
la source
49

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 'Book' (c'est-à-dire le nom du modèle)

vijay shanker
la source
1
Celui-ci m'a aidé dans mon cas. J'ai fusionné 2 ensembles de requêtes de modèles différents. Dans une boucle, j'avais besoin d'obtenir le nom de classe de l'objet lors de l'itération.
Peter
Peter, comment avez-vous fusionné deux ensembles de requêtes ?? Ou est-ce que l'ensemble fusionné est juste une liste d'instances de modèle? Merci
little_birdie
38

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 se trouve dans my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app
Geekfish
la source
2
Cela devrait être la réponse acceptée pour les nouvelles versions de Django.
Bobort
Vous avez raison @Bobort, cela fonctionne aussi sur la version Django 2.2.3.
Kushan Gunasekera
8

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

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase
Mohideen bin Mohammed
la source
Merci; str(self.model._meta)est ce que je cherchais; quant à l'autre, donnez-moi la classe des parents.
ppython
Si vous voulez quelque chose de plus implicite qu'un appel à string, alors vous pouvez obtenir le même (essayé sur Django 1.11) avec: Book._meta.object_nameou Book._meta.model_name. Ensuite, si vous voulez également le nom de l'application, il est accessible viaBook._meta.app_label
Geekfish
4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

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

Brkyrn
la source
3

Vous pouvez également récupérer le nom du modèle à partir de la classe Meta du modèle. Cela fonctionne sur la classe de modèle elle-même ainsi que sur toute instance de celle-ci:

# 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

Le réglage verbose_nameet verbose_name_pluralest facultatif. Django déduira ces valeurs à partir du nom de la classe de modèle (vous avez peut-être remarqué l'utilisation de ces valeurs sur le site d'administration).

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

Leo
la source