Листинг детей азбуки в Джанго - PullRequest
1 голос
/ 06 января 2012

Я использую Django 1.3.1, и у меня есть следующая модель:

class masterData(models.Model):
     uid = models.CharField(max_length=20,primary_key=True)

     class Meta:
          abstract = True;

class Type1(masterData):
     pass;

class Type2(masterData):
     pass;

Теперь я пытаюсь получить список всех дочерних классов masterData.Я пробовал:

masterData.__subclasses__()

Очень интересная вещь, которую я обнаружил в вышеприведенном, заключается в том, что она работает безупречно в python manage.py shell и не работаетвообще при работе веб-сервера!

Итак, как мне получить список моделей, полученных из модели Abstract Base Class?

Спасибо:)

1 Ответ

0 голосов
/ 06 января 2012
Metaclass for defining Abstract Base Classes (ABCs).

Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in 
class. You can also register unrelated concrete classes (even built-in classes) and unrelated ABCs 
as 'virtual subclasses' -- these and their descendants will be considered subclasses of the 
registering ABC by the built-in issubclass() function, but the registering ABC won't show up in 
their MRO (Method Resolution Order) nor will method implementations defined by the registering 
ABC be callable (not even via super()).

Я не очень много использовал ABCMeta (на самом деле немного сегодня ...). Вам нужно использовать функцию issubclass () так как ABC не появится в Mro.

Если вы используете наследование, подклассы () будут работать.

>>> class foo(object):
...      pass
... 
>>> class bar(foo):
...      pass
... 
>>> a = bar()
>>> a.__class__.__mro__
(<class '__main__.bar'>, <class '__main__.foo'>, <type 'object'>)
>>> foo.__subclasses__()
[<class '__main__.bar'>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...