В колбу с sqlalchemy
имеют 3 вложенные друг в друга таблицы:
models.py
:
class VariantManualReview( db.Model ) :
__tablename__ = 'variantmanualreview'
id = db.Column(db.Integer, primary_key=True, unique = True)
name = db.Column(db.String(256), index=True, unique=True)
last_review_on = db.Column(db.DateTime, index=True, default=datetime.now)
revisions = db.relationship('VariantManualRevisions', backref='author', lazy='dynamic')
class VariantManualRevisions( db.Model ) :
__tablename__ = 'variantmanualrevisions'
variant_id = db.Column(db.Integer, db.ForeignKey('variantmanualreview.id'))
id = db.Column(db.Integer, primary_key=True, unique = True)
reviewed_on = db.Column(db.DateTime, index=True, default=datetime.now)
reviewed_by = db.Column(db.String(128))
ACMG_overall = db.Column(db.String(16))
subcategories = db.relationship('VariantManualRevisionsSubcategories', backref='author', lazy='dynamic')
class VariantManualRevisionsSubcategories( db.Model ) :
__tablename__ = 'variantmanualrevisionssubcategories'
revision_id = db.Column(db.Integer, db.ForeignKey('variantmanualrevisions.id'))
id = db.Column(db.Integer, primary_key=True, unique = True)
reviewed_on = db.Column(db.DateTime, index=True, default=datetime.now)
reviewed_by = db.Column(db.String(128))
category = db.Column(db.String(16))
accepted = db.Column(db.Boolean, default=False)
notes = db.Column(db.String(256))
studies = db.relationship('VariantManualRevisionsSubcategoriesPMIDs', backref='author', lazy='dynamic')
В некоторых случаях мне нужно вставитьзапись для всех 3 таблиц одновременно, когда форма проверена, я пытался вставить и извлечь их, но это не выглядит оптимальным, чтобы зафиксировать все эти изменения в одном действии, и более того, страница перезагружается после каждого commit()
провалив утверждение if
:
### ... rest of routes.py ...
from app.models import VariantManualReview, VariantManualRevisions, VariantManualRevisionsSubcategories
### ... rest of routes.py ...
form = VariantCategoryRevision()
if form.validate_on_submit() :
if form.accepted.data == "Y" :
form_accepted = True
else :
form_accepted = False
form_notes = form.notes.data
### check if the var already reviewed
var_revision_exists = db.session.query(VariantManualReview.id).filter_by(name=var_name).scalar() is not None
### if a revision already exists add to relative variant subtables
if var_revision_exists :
var_revision = VariantManualReview.query.filter_by( name = var_name).first()
var_revision_overall = VariantManualRevisions.query.filter_by(variant_id = var_revision.id).all()
if var_revision_overall :
flash("variant already reviewed")
### if does not exist should create everything
else :
var_revision = VariantManualReview(
name = var_name
)
# add to database
db.session.add( var_revision )
# commit
db.session.commit()
# retrieve assigned ID
var_revision_added = VariantManualReview.query.filter_by(name = var_revision.name).first()
var_revision_overall = VariantManualRevisions(
variant_id = var_revision_added.id,
reviewed_by = current_user.username,
ACMG_overall = ACMG_overall
)
db.session.add( var_revision_overall )
db.session.commit()
var_revisions_overall_added = VariantManualRevisions.query.filter_by( variant_id = var_revisions_overall.variant_id ).first()
var_revision_subcategory = VariantManualRevisionsSubcategories(
revision_id = var_revisions_overall_added.id,
reviewed_by = current_user.username,
category = category,
accepted = form_accepted,
notes = form_notes,
)
db.session.add( var_revision_subcategory )
db.session.commit()
### ... rest of routes.py ...
Я оглянулся, но не нашел ответа, кто-нибудь понял, как это сделать?
Заранее большое спасибо залюбая помощь.