【问题标题】:Using `issubclass()` with Django models将 `issubclass()` 与 Django 模型一起使用
【发布时间】:2011-10-27 10:45:27
【问题描述】:

我有一些 Django 模型,比如说

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

class Bar(Foo)
    pass

我希望能够找到从 Foo 继承的所有模型,以便与它们一起执行任务。应该很简单,比如

from django.db import models
from myapp.models import Foo

for model in models.get_models():
    if issubclass(model, Foo):
        do_something()

唉,这不起作用,因为issubclass(Bar, Foo) 报告False,可能是由于初始化模型的 Django 元类的内部工作。

有没有办法检查 Django 模型是否是抽象 Django 模型的后代?

请不要建议使用鸭子打字作为解决方案。在这种情况下,我真的很想知道是否存在子类关系。

【问题讨论】:

  • 问自己同样的问题...经过多次测试和代码自省,我想这似乎是不可能的,因为抽象模型是可调用的,而子对象没有任何属性或适合这种需求的方法。
  • 看起来很奇怪...我刚刚在 virtualenv 中创建了一个新的 django 应用程序,您的代码正在运行,我的“do_something()”只是一个“打印模型”,它可以工作。结果:。你确定你的问题来自 abstract 吗?仅供参考,我正在使用 django 1.3.1
  • 也在 Django 1.3.1 上为我工作
  • 我必须管理,在一个新项目上它也对我有用。问题一定出在其他地方。抱歉,感谢您的帮助

标签: python django django-models


【解决方案1】:

问题在于您如何导入类。而不是:

from myapp.models import Foo

使用:

from myproject.myapp.models import Foo

要查看正确的方法,您可以查看 Django 是如何导入您的模型的:

print models.get_models()

【讨论】:

  • 如果我使用myapp.models 导入,您能解释一下为什么会出现问题吗?那么如果我想写一个可重用的应用程序,我必须写没有项目名称的 import-things,否则我错了?
【解决方案2】:

可能是这样的

subclasses = Foo.__subclasses__()
for subclass in subclasses:
    # we need to keep looking for subclasses of the subclasses
    subclasses += subclass.__subclasses__()
# sometimes we don't care about abstract classes
concrete_subclasses = filter(lambda c: not c._meta.abstract, subclasses)

【讨论】:

    【解决方案3】:

    使用

    Bar._meta.get_base_chain(Foo)
    

    获取描述FooBar 之间的继承链的列表。

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2012-10-30
      • 1970-01-01
      • 2018-12-06
      • 2011-02-11
      • 2013-02-27
      • 2010-11-30
      • 1970-01-01
      • 2013-05-02
      相关资源
      最近更新 更多