SQLAlchemy连接继承下父模型after_insert事件不触发及多态查询报错
问题1解决方案:子类插入不触发父类after_insert事件
SQLAlchemy的ORM事件默认不会继承传播到子类,只需在事件监听的装饰器中添加propagate=True参数即可:
@event.listens_for(User, "after_insert", propagate=True) def dispatch_confirmation_mail(mapper, connection, target): if not target.confirmed: _create_reauth_mail(target.email)
该参数会让父类绑定的事件同时对所有继承自它的子类生效,创建子类实例时也会触发对应的回调逻辑。
问题2解决方案:polymorphic_identity匹配错误
报错原因是多态鉴别字段role的类型为Enum(Role),存储的值是Role枚举实例,但你给每个子类设置的polymorphic_identity是字符串类型,二者类型不匹配导致SQLAlchemy找不到对应的多态映射。
只需把所有子类的polymorphic_identity值修改为对应的Role枚举值即可,示例如下:
Client模型修改示例
class Client(User): __tablename__ = "clients" id = Column(Integer, ForeignKey("users.id"), primary_key=True) __mapper_args__ = { "polymorphic_identity": Role.client, 'inherit_condition': (id == User.id) } # 其余字段保持不变
Brand模型修改示例
class Brand(User): __tablename__ = "brands" id = Column(Integer, ForeignKey("users.id"), primary_key=True) __mapper_args__ = { "polymorphic_identity": Role.brand, 'inherit_condition': id == User.id } # 其余字段保持不变
其余所有用户子类都按照上述规则修改,将polymorphic_identity的值替换为对应Role枚举成员即可。
内容的提问来源于stack exchange,提问作者Shefeek Najeeb
相关产品推荐
相关产品推荐

