Как я могу получить объект дочернего типа из объекта родительского класса, используя MTI?
У меня есть функция, get_priority()
, который сортирует все объекты в родительском классе (Chunk), чтобы получить объект с самым высоким приоритетом. Теперь я хочу получить связанный объект подкласса для объекта суперкласса.
Документы Django по наследованию нескольких таблиц показывают, что я могу сделать это, используя имя подкласса в нижнем регистре. Например, если подклассом был Concept, я мог бы сделать следующее:
chunk = get_priority(Chunk.objects.all())
chunk.concept
Тем не менее, подкласс может быть концепция, код, формула или проблема. Единственный способ приблизиться к этому - использовать try/ кроме каждого подкласса, например:
chunk = get_priority(Chunk.objects.all())
try:
object = chunk.concept
except:
pass
try:
object = chunk.code
except:
pass
# etc.
2 ответа
Я думаю, что это не лучший способ проверить, что это за ребенок, или, по крайней мере, самый простой.
Я думаю, у вас есть свой собственный метод, чтобы получить приоритет Chunk на get_priority()
(Лично я бы поставил его в диспетчере объектов Chunk), чтобы получить правильного потомка, я бы сделал это:
chunk = get_priority(Chunk.objects.all())
object = None
for attr in ('concept', 'code', 'formula', 'problem'):
if hasattr(chunk, attr):
object = getattr(chunk, attr)
В конце у вас будет ребенок в object
переменная или None
если у него нет ребенка, то вы можете поиграть с результатом в object
как бросить исключение, если ребенок не найден или просто pass
,
Я делаю вывод, что объекты Chunk имеют атрибут приоритета. Если это так, для сортировки набора запросов блоков следует использовать:
Chunk.objects.order_by('-priority')
И, обращаясь к самому вопросу, обратите внимание на: Указание поля родительской ссылки. Вы можете установить одинаковое ссылочное имя для всех подпунктов.
Далее я посоветую вам принять во внимание совет двух областей применения django:
Несовместимость с несколькими таблицами, которую иногда называют "конкретностью", считается авторами и многими другими разработчиками плохой вещью. Мы настоятельно рекомендуем не использовать его.