获取django模型的类名

sch*_*eck 98 django django-models

我有一个django模型:

class Book(models.Model):
  [..]
Run Code Online (Sandbox Code Playgroud)

我希望将模型名称设为字符串:'Book'.当我试图这样做时:

Book.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

它返回'ModelBase'.

任何的想法?

mik*_*iku 131

试试Book.__name__.

Django模型源于它ModelBase,它是所有模型的元类.


vij*_*ker 45

而不是Book.__class__.__name__在类本身上做,如果你在一个书对象上做,那么book_object.__class__.__name__会给你'书'(即模型的名称)


Gee*_*ish 25

上面答案所示,你可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 对于较新版本的Django,这应该是公认的答案。 (2认同)

Moh*_*med 8

我用了得到了班级名字,

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase
Run Code Online (Sandbox Code Playgroud)


Leo*_*Leo 6

您还可以从模型的 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
Run Code Online (Sandbox Code Playgroud)

设置verbose_nameverbose_name_plural是可选的。Django 将从模型类的名称推断这些值(您可能已经注意到在管理站点中使用了这些值)。

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


小智 5

class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

通过这种方式,每当您调用book.class_name()python 代码(也在模板中{{book.class_name}})时,它将返回类名,即“Book”。