Как вызвать правильный метод в унаследованной модели django - PullRequest
2 голосов
/ 12 октября 2011

У меня есть классы моделей B и C, которые реализуют метод f и наследуют от класса моделей A. Я хочу вызвать функцию f на всех экземплярах A (B и C). Почему

for a in A.objects.all():
    a.f()

Не работает должным образом?

Ответы [ 3 ]

3 голосов
/ 12 октября 2011

Это потому, что менеджер по умолчанию django не управляет полиморфизмом.Поэтому, когда вы делаете

for a in A.objects.all():
    …

Все ваши a объекты относятся к типу A, а не к типу B или C.

Вам необходимо использовать django-model-utils приложение, и это select_subclasses инструмент:

for a in A.objects.select_subclasses():
    # type(a) returns the correct subclass
0 голосов
/ 21 сентября 2012

Если ваша модель использует одни и те же данные (т.е. вам нужны только пользовательские методы), вы можете использовать прокси-трюк, описанный здесь: http://anthony -tresontani.github.com / Python / 2012/09/11 / django-polymorphism/

0 голосов
/ 12 октября 2011
for a in A.objects.all():    
    hasattr(a,'f') and callable(a.f) and a.f()

Итак, сначала проверьте, имеет ли атрибут «f», затем, если его можно вызвать, и, наконец, вызовите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...