коллеги,приветствую! У меня структура из трех таблиц,одна из которых closure table
class Task(db.Model):
tablename = 'task'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
task = db.Column(db.Text)
topics = db.relationship('Topic', backref='task')
topics_id = db.Column(db.Integer, db.ForeignKey('
topic.id'))
class ClosureTableCategory(db.Model):
tablename = 'ClosureTableCategory'
id = db.Column(db.Integer, primary_key=True)
ancestor_id = db.Column(db.Integer, db.ForeignKey('
topic.id'))
descendant_id = db.Column(db.Integer, db.ForeignKey('
topic.id'))
depth = db.Column(db.Integer, nullable=False)
class Topic(db.Model):
tablename = 'topic'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(140))
descendant = db.relationship(
'Topic',
backref='ancestors',
secondary='ClosureTableCategory',
primaryjoin=id == ClosureTableCategory.ancestor_id,
secondaryjoin=id == ClosureTableCategory.descendant_id
)
Я хочу вывести все значения из таблицы Task, у которых тема является наследником и предком Algebra
top = Topic.query.filter(
Topic.name == "Algebra").first()
top_2 = ClosureTableCategory.query.filter(db.or_(ClosureTableCategory.descendant_id ==
top.id,ClosureTableCategory.ancestor_id==
top.id)).all()
top_3 =[]
for topi in top_2:
top_3.append(topi.ancestor_id)
top_3.append(topi.descendant_id)
top_4 = Task.query.filter(Task.topics_id.in_(top_3)).all()
for topi in top_4:
print(str(topi.task))
Данный код работает, однако он какой-то не очень удачный. Я попытался сделать через join:
db.session.query(ClosureTableCategory,Topic).\
join(Topic, ClosureTableCategory.descendant_id ==
Topic.id or ClosureTableCategory.ancestor_id ==
Topic.id).\
filter(
Topic.name == 'Algebra').all()
НО выводятся либо столбцы,где предки являются родителями
Category.ancestor_id ==
Topic.idлибо предками
ClosureTableCategory.descendant_id ==
Topic.idвопрос: как сделать так,чтобы выводились записи,в которых есть и родители и предки?