Я использую Django / Python, но псевдокод здесь определенно приемлем.
Работая с некоторыми уже существующими моделями, у меня есть Employee
, каждая из которых имеет Supervisor
, что по сути является отношением типа внешнего ключа к другому Employee
.
Где иерархия Сотрудник / Супервизор выглядит примерно так:
У любого сотрудника есть ОДИН руководитель. У этого Супервайзера может быть один или несколько Сотрудников «внизу», а также есть свой Супервайзер. Получение моего «вышестоящего» должно возвращать моего руководителя, его руководителя, ее руководителя и т. Д. До тех пор, пока я не достигну сотрудника, у которого нет руководителя.
Не зацикливаясь и не устанавливая новые приложения для управления этими отношениями, поскольку это уже существующая кодовая база и проект, я задаюсь вопросом о «питоническом» или правильном способе реализации следующих функций:
def get_upline(employee):
# Get a flat list of Employee objects that are
# 'supervisors' to eachother, starting with
# the given Employee.
pass
def get_downline(employee):
# Starting with the given Employee, find and
# return a flat list of all other Employees
# that are "below".
pass
Я чувствую, что может быть несколько более простой способ сделать это с помощью Django ORM, но если нет, я приму любые предложения.
Я не изучал полностью Django-MPTT, но если я смогу оставить модели в неизменном виде и просто получить больше функциональности, это того стоит.