Как рекурсивно получить детей в Flask SQLAlchemy? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть модель:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key = True)
    login = db.Column(db.String(20), unique = True, nullable = False)
    username = db.Column(db.String(200), nullable = True)
    password = db.Column(db.String(60), nullable = False)
    user_level = db.Column(db.Integer, nullable = False)
    parent_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    terminals = db.relationship('Terminal', backref='owner', lazy = True)

    controled_users = db.relationship('User', backref=db.backref('parent', remote_side=[id]), lazy = True)

    def get_children_list(self) -> []:
        beginning_getter = db.session.query(User).\
                filter(User.id == id).cte(name='children_for', recursive=True)
        with_recursive = beginning_getter.union_all(
                db.session.query(User).filter(User.parent_id == beginning_getter.c.id)
            )
        return db.session.query(with_recursive).all()

    def __repr__(self):
        return "User('{0}')".format(self.username)

Таким образом, у каждого User может быть ребенок пользователя, который может иметь своих детей.
Я попытался получить список всех детей:

current_user.get_children_list()

И получил ошибку:

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type.
[SQL: WITH RECURSIVE children_for(id, login, username, password, user_level, parent_id) AS
(SELECT user.id AS id, user.login AS login, user.username AS username, user.password AS password, user.user_level AS user_level, user.parent_id AS parent_id
FROM user
WHERE user.id = ? UNION ALL SELECT user.id AS user_id, user.login AS user_login, user.username AS user_username, user.password AS user_password, user.user_level AS user_user_level, user.parent_id AS user_parent_id
FROM user, children_for
WHERE user.parent_id = children_for.id)
SELECT children_for.id AS children_for_id, children_for.login AS children_for_login, children_for.username AS children_for_username, children_for.password AS children_for_password, children_for.user_level AS children_for_user_level, children_for.parent_id AS children_for_parent_id
FROM children_for]
[parameters: (<built-in function id>,)]
(Background on this error at: http://sqlalche.me/e/rvf5)

Не можете найти в чем здесь проблема?

1 Ответ

1 голос
/ 11 апреля 2020

Вам, вероятно, следует изменить User.id == id на User.id == self.id

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