Получить имя класса модели django

107

У меня есть модель django:

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

и я хочу иметь название модели в виде строки: «Книга». Когда я пытаюсь понять это так:

Book.__class__.__name__

он возвращает "ModelBase".

Любая идея?

Schneck
источник

Ответы:

153

Попробуй Book.__name__.

Модели Django являются производными от ModelBaseMetaclass для всех моделей.

мику
источник
49

Вместо того, чтобы делать это Book.__class__.__name__в самом классе, если вы делаете это над объектом-книгой, тогда book_object.__class__.__name__вы получите 'Book' (то есть имя модели).

Виджей Шенкер
источник
1
Этот помог мне в моем случае. Я объединил 2 набора запросов разных моделей. В цикле мне нужно было получить имя класса объекта, когда я повторяю.
Питер
Питер, как ты объединил два набора запросов ?? Или объединенный набор - это просто список экземпляров модели ?? Спасибо
little_birdie
39

Как указано в ответе выше , вы можете использовать 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
Geekfish
источник
3
Это должен быть принятый ответ для новых версий Django.
Bobort
Вы правы, @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}}), он возвращает имя класса «Книга».

Brkyrn
источник
3

Вы также можете получить название модели из класса Meta модели. Это работает как с классом модели, так и с любым его экземпляром:

# 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

Лео
источник