Size: a a a

2021 April 26

AS

Artem Sakhno in Python Flask
Понял, спасибо
источник

ВК

Владимир Кузовкин... in Python Flask
коллеги,приветствую! У меня структура из трех таблиц,одна из которых 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
вопрос: как сделать так,чтобы выводились записи,в которых есть и родители и предки?
источник

AT

Alex Ted in Python Flask
залей всё свое добро на пасту/гисту
источник

DX

Dex X in Python Flask
Как вам такая структура проекта?

app/
   __init__.py
   setup.py
   models/
       __init__.py
       book.py
   routes/
       __init__.py
       books.py
источник

DX

Dex X in Python Flask
В моделях лежат модели с ОРМ, в рутах - блупринты как у Smorest, внутри каждого файла методвью и схемы маршмэллоу
источник

AT

Alex Ted in Python Flask
Схемы и вьюхи в одних и тех же файлах?
источник

DX

Dex X in Python Flask
Ага
источник

AT

Alex Ted in Python Flask
Ну, такое
источник

AT

Alex Ted in Python Flask
А где апп определён? В ините небось?
источник

DX

Dex X in Python Flask
А я пока хз, я пытаюсь переделать аппку
источник

DX

Dex X in Python Flask
даже хз че в сетап писать
источник

AT

Alex Ted in Python Flask
Переименуй его не в сетап, во что то более понятное
источник

AT

Alex Ted in Python Flask
Типа flask_app, к примеру
источник

DX

Dex X in Python Flask
Я из примера взял

from setuptools import setup

setup(
   name='yourapplication',
   packages=['yourapplication'],
   include_package_data=True,
   install_requires=[
       'flask',
   ],
)
источник

DX

Dex X in Python Flask
Это как пакет
источник

AT

Alex Ted in Python Flask
Потом туда могут добавиться celery_app
источник

AT

Alex Ted in Python Flask
Это будет наглядно и понятно
источник

AT

Alex Ted in Python Flask
Точки входа (инициализации приложений) можно бы вынести на рутовый уровень
источник

T

Tishka17 in Python Flask
Сетап на уровень выше вынест
источник

DX

Dex X in Python Flask
А у меня там уже докерфайл лежит
источник