Использование гибридного свойства для возврата другого подзапроса в SQLAlchemy - PullRequest
0 голосов
/ 25 августа 2018

Предположим, следующий код sqlalchemy для базы данных SQLlite:

from sqlalchemy import (Column, Unicode, Integer)
from sqlalchemy.ext.declarative import declarative_base
from mypackage import get_ancestors_id

class Person(Base):
    __tablename__ = 'persons'
    id = Column('id', Integer, primary_key=True, nullable=False)
    name = Column('name', Unicode(16), nullable=False)
    age = Column('age', Integer)

    @hybrid_property
    def ancestors(self):
         # get_ancestors_id will return a list of IDs, ie: [1,3,4]
         # get_ancestors_id should return a list of Person objects
         return get_ancestors_id(self.id)

и следующие данные:

+-----------+-----------+-----------+
|Id         |Name       |Age        |
+-----------+-----------+-----------+
|1          |John       |70         | 
+-----------+-----------+-----------+
|2          |Olivia     |68         | 
+-----------+-----------+-----------+
|3          |Alex       |43         | 
+-----------+-----------+-----------+
|4          |Anna       |40         | 
+-----------+-----------+-----------+
|5          |Daniel     |8          | 
+-----------+-----------+-----------+
|6          |Paul       |5          | 
+-----------+-----------+-----------+

Я использую библиотеку networkx для работы с направленным графом. Используя его, я написал функцию get_ancestors_id, которая возвращает идентификатор для всех предков человека.

Для Даниила (id 5) вернул бы список с идентификаторами 4 (мать), 3 (отец), 2 (бабушка) и 1 (дедушка).

Для Алекса (id 3) вернется список с идентификаторами 2 (мама) и 1 (папа).

При использовании гибридного свойства ancestors он должен возвращать список Person объектов, представляющих предков этого человека. Гибридное свойство в том виде, в котором оно закодировано, теперь будет возвращать только список идентификаторов предков, но не объекты, чего я и хочу.

Я думаю, что мне следует создать второй подзапрос или что-то в этом роде, но все попытки до сих пор были бесполезны.

Как мне это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...