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?

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.


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)


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

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

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.