如何在Flask SQLAlchemy中实现父类与子枚举的一对多关系?
Flask-SQLAlchemy 父类与枚举的一对多关联实现
完整代码实现
首先给关联表添加联合主键约束(避免同一父类重复关联同一枚举),再完善Parent类的children关联配置:
from enum import Enum from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Child(Enum): CHILD1 = 'child1' CHILD2 = 'child2' CHILD3 = 'child3' # 关联表:添加联合主键确保关联唯一性 parent_child = db.Table('parent_child', db.Column('parent_id', db.Integer, db.ForeignKey('parents.id'), nullable=False), db.Column('child', db.Enum(Child), nullable=False), db.PrimaryKeyConstraint('parent_id', 'child') ) class Parent(db.Model): __tablename__ = 'parents' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) # 完善后的children关联配置 children = db.relationship( Child, secondary=parent_child, primaryjoin=(id == parent_child.c.parent_id), secondaryjoin=(parent_child.c.child == db.cast(db.func.any(Child), db.Enum(Child))), uselist=True, lazy='select', collection_class=set # 可选:用集合存储避免内存层面重复 )
关键配置说明
secondary=parent_child:指定用于关联的中间表primaryjoin:明确父表Parent.id与中间表parent_child.parent_id的关联条件secondaryjoin:处理中间表child列与枚举类型的匹配,保证类型一致性uselist=True:声明一个父类可关联多个枚举值(默认值,显式声明更清晰)lazy='select':按需加载关联数据,可根据业务需求改为'joined'(即时加载)collection_class=set:可选配置,用集合存储关联枚举值,避免内存层面出现重复项
使用示例
# 创建父类并关联枚举值 parent = Parent(name="测试父类") parent.children.add(Child.CHILD1) parent.children.add(Child.CHILD3) db.session.add(parent) db.session.commit() # 查询并输出关联的枚举值 fetched_parent = Parent.query.get(parent.id) print([child.value for child in fetched_parent.children]) # 输出: ['child1', 'child3']
内容的提问来源于stack exchange,提问作者Casio991ms
相关产品推荐
相关产品推荐

