Как я могу получить объект дочернего типа из объекта родительского класса, используя 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:

Несовместимость с несколькими таблицами, которую иногда называют "конкретностью", считается авторами и многими другими разработчиками плохой вещью. Мы настоятельно рекомендуем не использовать его.

Другие вопросы по тегам