ChatGPT解决这个技术问题 Extra ChatGPT

获取 django 模型的类名

我有一个 Django 模型:

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

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

Book.__class__.__name__

它返回“模型库”。

任何想法?


m
miku

试试 Book.__name__

Django 模型派生自 ModelBase,它是所有模型的元类。


v
vijay shanker

如果您对图书对象执行 Book.__class__.__name__ 而不是对类本身执行 book_object.__class__.__name__,那么 book_object.__class__.__name__ 将为您提供“图书”(即模型的名称)


在我的情况下,这对我有所帮助。我合并了 2 个不同模型的查询集。在循环中,我需要在迭代时获取对象的类名。
彼得,你是如何合并两个查询集的?还是合并集只是模型实例的列表?谢谢
O
OrangeDog

正如 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

对于较新版本的 Django,这应该是公认的答案。
你是对的@Bobort,它也适用于 Django 版本 2.2.3
这正是我所需要的。这适用于模型/类本身和模型的实例。
M
Mohideen bin Mohammed

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

str(Book._meta)

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

谢谢; str(self.model._meta) 是我一直在寻找的;至于其他给我父类。
如果您想要比对字符串的调用更隐含的东西,那么您可以使用:Book._meta.object_nameBook._meta.model_name 获得相同的结果(在 Django 1.11 上尝试过)。然后,如果您还想要应用名称,可以通过 Book._meta.app_label 访问
H
Hussam
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

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


L
Leo

您还可以从模型的 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/en/3.0/ref/models/options/#verbose-name