Отримайте назву класу моделі django


107

У мене є модель джанго:

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

і я хочу мати назву моделі як рядок: "Книга". Коли я намагаюся отримати це так:

Book.__class__.__name__

він повертає 'ModelBase'.

Будь-яка ідея?

Відповіді:


153

Спробуйте Book.__name__.

Моделі Джанго є похідними від ModelBase, який є метакласом для всіх моделей.


49

Замість того, щоб робити Book.__class__.__name__на самому класі, якщо ви робите це над книжковим об'єктом, тоді book_object.__class__.__name__ви отримаєте "Книга" (тобто назва моделі)


1
Цей мені допоміг у моєму випадку. Я об'єднав 2 набори запитів, які мають різні моделі. У циклі мені потрібно було отримати ім'я класу об'єкта, коли я ітератую.
Пітер

Петре, як ти з’єднав два запити ?? Або об'єднаний набір є лише переліком екземплярів моделі ?? Дякую
little_birdie

38

Як запропоновано у відповіді вище , ви можете використовувати str(Book._meta).

Це запитання досить старе, але я виявив таке корисне (тестувалося на Django 1.11, але може працювати і на старих версіях ...), оскільки у вас також може бути однакова назва моделі з декількох додатків.

Припускаючи, що Книга знаходиться у my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
Це має бути прийнятою відповіддю для нових версій Django.
Боберт

Ви маєте рацію @Bobort, він працює і над версією Django 2.2.3.
Кушань Гунасекера

8

Я отримав назву класу за допомогою,

str(Book._meta)

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

Дякую; str(self.model._meta)це те, що я шукав; що стосується інших, дайте мені батьківський клас.
ppython

Якщо ви хочете щось більш неявне, ніж дзвінок на рядок, ви можете отримати те саме (спробували на Django 1.11) з: Book._meta.object_nameабо Book._meta.model_name. Тоді якщо ви також хочете назву програми, це доступно черезBook._meta.app_label
Geekfish

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

Таким чином, кожного разу, коли ви зателефонуєте book.class_name()в код python (також у шаблоні {{book.class_name}}), він поверне назву класу, яка є "Book".


3

Ви також можете отримати ім'я моделі з мета-класу моделі. Це працює як на самому класі моделі, так і на будь-якому його екземплярі:

# 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

Налаштування verbose_nameта verbose_name_pluralнеобов’язкове. Django виведе ці значення з імені класу моделі (ви, можливо, помітили використання цих значень на сайті адміністратора).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.