You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:50:55