Использование `issubclass ()` с моделями Django - PullRequest
6 голосов
/ 27 октября 2011

У меня есть несколько моделей 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, который инициализирует модели.

Есть ли способ проверить, является ли модель Джанго потомком абстрактной модели Джанго?

Пожалуйста, не предлагайте утку печатать как решение. В этом случае я действительно хотел бы знать, существует ли отношение подкласса.

Ответы [ 3 ]

1 голос
/ 10 января 2012

Проблема в том, как вы импортируете классы.Вместо:

from myapp.models import Foo

используйте:

from myproject.myapp.models import Foo

Чтобы увидеть, как это правильно, вы можете увидеть, как Django импортирует ваши модели с:

print models.get_models()
0 голосов
/ 10 января 2012

Используйте

Bar._meta.get_base_chain(Foo)

, чтобы получить список, описывающий цепочку наследования от Foo до Bar.

0 голосов
/ 27 октября 2011

может быть что-то вроде

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)
...