Uzyskaj nazwę klasy modelu django

107

Mam model django:

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

i chcę, aby nazwa modelu była ciągiem: „Książka”. Kiedy próbuję uzyskać to w ten sposób:

Book.__class__.__name__

zwraca „ModelBase”.

Dowolny pomysł?

schneck
źródło

Odpowiedzi:

153

Spróbuj Book.__name__.

Modele Django pochodzą z klasy ModelBase, która jest metaklasą dla wszystkich modeli.

miku
źródło
49

Zamiast Book.__class__.__name__zajmować się samą klasą, jeśli zrobisz to na obiekcie z książki, book_object.__class__.__name__otrzymasz `` Book '' (tj. Nazwę modelu)

vijay shanker
źródło
1
Ten pomógł mi w moim przypadku. Połączyłem 2 zestawy zapytań, które mają różne modele. W pętli potrzebowałem uzyskać nazwę klasy obiektu podczas iteracji.
Peter
Peter, jak scaliłeś dwa zestawy zapytań? A może scalony zestaw jest tylko listą instancji modelu? Dzięki
little_birdie
38

Jak sugeruje powyższa odpowiedź , możesz użyć str(Book._meta).

To pytanie jest dość stare, ale uznałem je za pomocne (testowane na Django 1.11, ale może działać na starszych ...), ponieważ możesz również mieć tę samą nazwę modelu z wielu aplikacji.

Zakładając, że książka jest w my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app
Geekfish
źródło
2
To powinna być akceptowana odpowiedź dla nowszych wersji Django.
Bobort
Masz rację @Bobort, działa też na wersji Django 2.2.3.
Kushan Gunasekera
8

Otrzymałem nazwę klasy, używając,

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase
Mohideen bin Mohammed
źródło
Dzięki; str(self.model._meta)jest tym, czego szukałem; co do drugiej daj mi klasę rodzicielską.
ppython
Jeśli chcesz czegoś bardziej niejawnego niż wywołanie łańcucha, możesz uzyskać to samo (wypróbowane w Django 1.11) za pomocą: Book._meta.object_namelub Book._meta.model_name. Jeśli chcesz również nazwę aplikacji, jest dostępna za pośrednictwemBook._meta.app_label
Geekfish
4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

W ten sposób za każdym razem, gdy book.class_name()wywołałeś kod Pythona (również w szablonie {{book.class_name}}), zwróci on nazwę klasy, która to „Książka”.

Brkyrn
źródło
3

Możesz również pobrać nazwę modelu z klasy Meta modelu. Działa to na samej klasie modelu, jak również na każdym jej egzemplarzu:

# 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

Ustawienie verbose_namei verbose_name_pluraljest opcjonalne. Django wywnioskuje te wartości z nazwy klasy modelu (być może zauważyłeś użycie tych wartości na stronie administratora).

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

Lew
źródło