У меня есть классы моделей B и C, которые реализуют метод f и наследуют от класса моделей A. Я хочу вызвать функцию f на всех экземплярах A (B и C). Почему
for a in A.objects.all(): a.f()
Не работает должным образом?
Это потому, что менеджер по умолчанию django не управляет полиморфизмом.Поэтому, когда вы делаете
for a in A.objects.all(): …
Все ваши a объекты относятся к типу A, а не к типу B или C.
a
Вам необходимо использовать django-model-utils приложение, и это select_subclasses инструмент:
select_subclasses
for a in A.objects.select_subclasses(): # type(a) returns the correct subclass
Если ваша модель использует одни и те же данные (т.е. вам нужны только пользовательские методы), вы можете использовать прокси-трюк, описанный здесь: http://anthony -tresontani.github.com / Python / 2012/09/11 / django-polymorphism/
for a in A.objects.all(): hasattr(a,'f') and callable(a.f) and a.f()
Итак, сначала проверьте, имеет ли атрибут «f», затем, если его можно вызвать, и, наконец, вызовите его.