【问题标题】:Django - how to determine if model class is abstractDjango - 如何确定模型类是否是抽象的
【发布时间】:2010-12-18 20:58:17
【问题描述】:

如果 django 模型是抽象的,如下所示,有没有办法检查类以确定它是抽象的?

class MyModel(models.Model):
  class Meta:
    abstract = True

我希望我可以检查 MyModel.Meta.abstract,但根据 Django 文档:

Django 确实对抽象基类的 Meta 类做了一项调整:在安装 Meta 属性之前,它设置 abstract=False。这意味着抽象基类的子类本身不会自动成为抽象类。

有什么想法吗?谢谢!

【问题讨论】:

  • 看源码有什么问题?它始终可用。
  • 文档的摘要与派生类的元相关,而不是基类。
  • @S.Lott - 事实上,我是 RTFM,但未能通过 RTFS。公平地说,许多关于 S.O. 的问题。通过阅读源代码可能可以自我回答。 @Dmitry - 你的评论让我有点困惑。从 django/db/basy.py 中,似乎 Meta 类中的所有属性都被转移到了一个新的类,称为 _meta。正是这个类保存了模型的 Meta 类中的原始抽象值集。无论如何,@sheats 回答了我的问题(再次感谢)。

标签: django django-models


【解决方案1】:

您可以实例化 MyModel,然后检查 ._meta.abstract。

所以在代码中:

m = MyModel()
print m._meta.abstract

【讨论】:

  • 我没有在 dir(MyModel) 中发现它,但它就在那里。非常感谢。
  • 如果您还没有研究过 iPython,我强烈建议您这样做。由于它提供自动完成功能,因此对于玩耍和找出这些东西非常有用。我就是这样找到这个的=)
  • 在Python中从外部访问受保护的成员是否正常?
【解决方案2】:

我想指出,您不需要实例化模型来检查它是否是抽象的 - Django 模型继承了一个在类实例化时添加 _meta 的实际元类。

所以,类似于@sheats 的代码,试试

from django.db.models import Model
class MyModel(Model):
  pass
print MyModel._meta.abstract

或者,举个正面的例子

from django.db.models import Model
class MyModel(Model):
  class Meta(object):
    abstract = True
print MyModel._meta.abstract

当然,这也适用于内置模型和任何从 Django 模型继承的东西。

from django.contrib.auth.models import User
print User._meta.abstract

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2011-01-19
    • 2020-10-02
    • 1970-01-01
    • 2018-12-21
    • 2018-02-21
    相关资源
    最近更新 更多