Этот ответ неполный, поскольку я не могу воспроизвести ваш первый выпуск. Когда я перечисляю объекты родительской модели, я вижу их все. (Или, может быть, есть какое-то недопонимание.)
Проблема с неполными полями может быть частично решена с помощью встроенного администратора. Поскольку подкласс - это просто модель с неявным отношением OneToOneField к родительской модели, вы можете определить встроенную строку для «C», а затем включить ее в атрибут inlines
в администраторе B.
Проблемы:
- Пользователь не сможет создать объект класса "C" через встроенный админ B; это может быть сделано только через администратора С. Это только просмотр.
- Он не будет работать с несколькими уровнями наследования: вы можете включить B в администратор A в качестве встроенного, но я не знаю простого способа включить C в качестве встроенного для встроенного в B.
Другой способ - изменить шаблон администратора A, поместив там ссылку на реальный экземпляр (будь то B или C). Но я полагаю, вы уже подумали об этом.
Относительно последнего вопроса: если вы хотите изменить набор запросов администратора какой-либо модели, это можно сделать с помощью метода queryset()
ModelAdmin (см. Пример в этот вопрос ). Вы можете переопределить этот метод на администраторе вашей модели и разместить там логику select_subclasses()
. Но я не пробовал, поэтому не могу сказать, как поведет себя ModelAdmin, если вы сделаете это. Возможно, вам придется переопределить еще несколько методов.
PS. В настоящее время я использую django-polymorphic
, работая над аналогичным проектом с конкретным наследованием. Он также не предоставляет каких-либо средств для управления полиморфными моделями через администратора, поэтому я решил не полагаться на администраторов Django для этого, а просто создать простой пользовательский интерфейс для сотрудников сайта, думаю, это не займет много времени.