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ł?

Odpowiedzi:


153

Spróbuj Book.__name__.

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


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)


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

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

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.