我有一个 Django 模型:
class Book(models.Model):
[..]
我想将模型名称作为字符串:'Book'。当我尝试以这种方式获得它时:
Book.__class__.__name__
它返回“模型库”。
任何想法?
试试 Book.__name__
。
Django 模型派生自 ModelBase
,它是所有模型的元类。
如果您对图书对象执行 Book.__class__.__name__
而不是对类本身执行 book_object.__class__.__name__
,那么 book_object.__class__.__name__
将为您提供“图书”(即模型的名称)
正如 answer above 所建议的,您可以使用 str(Book._meta)
。
这个问题很老了,但我发现以下内容很有帮助(在 Django 1.11 上测试,但可能适用于旧版本......),因为您可能也有来自多个应用程序的相同型号名称。
假设 Book 在 my_app
中:
print(Book._meta.object_name)
# Book
print(Book._meta.model_name)
# book
print(Book._meta.app_label)
# my_app
2.2.3
。
我通过使用获得了班级名称,
str(Book._meta)
Book.__class__.__name__ -> this will give you the ModelBase
str(self.model._meta)
是我一直在寻找的;至于其他给我父类。
Book._meta.object_name
或 Book._meta.model_name
获得相同的结果(在 Django 1.11 上尝试过)。然后,如果您还想要应用名称,可以通过 Book._meta.app_label
访问
class Book(models.Model):
[..]
def class_name(self):
return self.__class__.__name__
通过这种方式,每当您在 python 代码中调用 book.class_name()
(也在模板 {{book.class_name}}
中)时,它都会返回类名“Book”。
您还可以从模型的 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