Ottieni il nome della classe del modello django


107

Ho un modello django:

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

e voglio avere il nome del modello come stringa: "Libro". Quando provo a ottenerlo in questo modo:

Book.__class__.__name__

restituisce "ModelBase".

Qualche idea?

Risposte:


153

Prova Book.__name__.

I modelli Django derivano dal ModelBase, che è il Metaclass per tutti i modelli.


49

Invece di fare Book.__class__.__name__sulla classe stessa, se lo fai su un oggetto libro, allora book_object.__class__.__name__ti darà 'Libro' (cioè il nome del modello)


1
Questo mi ha aiutato nel mio caso. Ho unito 2 set di query di modelli diversi. In un ciclo avevo bisogno di ottenere il nome della classe dell'oggetto durante l'iterazione.
Peter

Peter, come hai unito due querysets ?? O l'insieme unito è solo un elenco di istanze del modello? Grazie
little_birdie

38

Come suggerito dalla risposta sopra , puoi usare str(Book._meta).

Questa domanda è piuttosto vecchia, ma ho trovato utile quanto segue (testato su Django 1.11, ma potrebbe funzionare su vecchi ...), poiché potresti anche avere lo stesso nome di modello da più app.

Supponendo che Book sia in my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
Questa dovrebbe essere la risposta accettata per le versioni più recenti di Django.
Bobort

Hai ragione @Bobort, funziona anche con la versione Django 2.2.3.
Kushan Gunasekera

8

Ho ottenuto il nome della classe utilizzando,

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase

Grazie; str(self.model._meta)è quello che stavo cercando; per quanto riguarda gli altri dammi la classe genitore.
ppython

Se vuoi qualcosa di più implicito di una chiamata a stringa, puoi ottenere lo stesso (provato su Django 1.11) con: Book._meta.object_nameo Book._meta.model_name. Quindi, se vuoi anche il nome dell'app, è accessibile tramiteBook._meta.app_label
Geekfish

4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

In questo modo, ogni volta che si chiama book.class_name()in codice python (anche nel modello {{book.class_name}}) verrà restituito il nome della classe che è "Book".


3

È inoltre possibile recuperare il nome del modello dalla classe Meta del modello. Funziona sulla classe del modello stessa e su qualsiasi istanza di essa:

# 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

L'impostazione verbose_nameed verbose_name_pluralè opzionale. Django dedurrà questi valori dal nome della classe del modello (potresti aver notato l'uso di quei valori nel sito di amministrazione).

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.