获取Django模型的类名


107

我有一个Django模型:

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

我想将模型名称作为字符串:“ Book”。当我尝试以这种方式获取它时:

Book.__class__.__name__

它返回“ ModelBase”。

任何想法?

Answers:


153

尝试Book.__name__

Django模型是从派生的ModelBase,后者是所有模型的元类。


49

Book.__class__.__name__如果不对类本身进行操作,而是对书对象进行处理,book_object.__class__.__name__则将得到“书”(即模型的名称)


1
就我而言,这对我有所帮助。我合并了两个不同模型的查询集。在循环中,我需要在迭代时获取对象的类名。
彼得

彼得,您是如何合并两个查询集的?还是合并的集合只是模型实例的列表?谢谢
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

您是正确的@Bobort,它也适用于Django版本2.2.3
Kushan Gunasekera

8

我通过使用获得班级名称,

str(Book._meta)

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

谢谢; str(self.model._meta)是我一直在寻找的东西;至于另一个给我的家长班。
ppython

如果您想要比调用字符串更隐式的内容,则可以使用:Book._meta.object_name或获得相同的内容(在Django 1.11上试用)Book._meta.model_name。然后,如果您还想要应用程序名称,则可以通过Book._meta.app_label
Geekfish '18

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

这样,每当您book.class_name()在python代码中(也在template中{{book.class_name}})调用时,它将返回类名'Book'。


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_nameverbose_name_plural是可选的。Django将从模型类的名称推断这些值(您可能已经在管理站点中注意到了这些值的使用)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.