Solved by the following. Retains the ability to use Main.query.all() functionality. Thanks for the pointer, @snakecharmerb.
__init__.py
#Model Base Class
class Base(DeclarativeBase, MappedAsDataclass):
pass
app = Flask(__name__)
app.json = BetterJsonProvider(app)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://login:passwd@localhost/db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
CORS(app)
db = SQLAlchemy(app, model_class=Base)
"Dataclasses" now look like this:
class Main(db.Model):
__tablename__="main"
id: int = db.Column(db.Integer, primary_key=True)
ones: Mapped[List[One]] = db.relationship("One", secondary="manys", overlaps="many,one")
class Many(db.Model):
__tablename__ = "manys"
main_id = db.Column(db.Integer, db.ForeignKey("main.id"), primary_key=True)
one_id = db.Column(db.Integer, db.ForeignKey("one.id"), primary_key=True)
x = db.Column(db.Boolean, nullable=False, default=False)
class One(db.Model):
__tablename__ = "ones"
id: int = db.Column(db.Integer, primary_key=True)
name: str = db.Column(db.String, nullable=False)
other_id: int = db.Column(db.Integer, nullable=False)
many_link = db.relationship("Many", backref="ones", uselist=False)
many_x: Mapped[bool] = association_proxy("many_link", "x", default_factory=bool)