【问题标题】:Get class name of django model获取 django 模型的类名
【发布时间】:2011-04-05 16:46:20
【问题描述】:

我有一个 django 模型:

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

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

Book.__class__.__name__

它返回“ModelBase”。

有什么想法吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    试试Book.__name__

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这个对我有帮助。我合并了 2 个不同模型的查询集。在循环中,我需要在迭代时获取对象的类名。
      • 彼得,你是如何合并两个查询集的?还是合并集只是模型实例的列表?谢谢
      【解决方案3】:

      按照answer above的建议,您可以使用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
      

      【讨论】:

      • 这应该是新版本 Django 的公认答案。
      • 你说得对@Bobort,它也适用于Django 版本2.2.3
      • 这正是我所需要的。这适用于 模型/类本身和模型的实例。
      【解决方案4】:

      我通过使用得到了类名,

      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 访问
      【解决方案5】:
      class Book(models.Model):
        [..]   
        def class_name(self):
          return self.__class__.__name__
      

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

      【讨论】:

        【解决方案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
        

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

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

        【讨论】:

          猜你喜欢
          • 2018-03-10
          • 2014-11-02
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 2019-05-14
          • 2015-10-12
          相关资源
          最近更新 更多