如何在SQLAlchemy中通过关系配置自动填充表的外键字段?
问题原因
你当前仅将Child实例绑定到了Parent1的child属性上,SQLAlchemy只会自动填充对应的parent1_id外键。因为没有建立Child和Parent2的关联,所以parent2_id默认就是NULL。另外注意你给出的Child模型漏写了__tablename__属性,实际运行会报错,需要先补上:
class Child(Base): __tablename__ = 'child' # 补上该行配置 id = Column(Integer, primary_key=True) parent1_id = Column(Integer, ForeignKey('parent1.id')) parent2_id = Column(Integer, ForeignKey('parent2.id'))
解决方案
方案1:调整业务赋值逻辑(无需修改模型)
只需要在赋值时同时把Child实例绑定到Parent2的child属性上即可:
parent1 = Parent1(name="Adil") parent2 = Parent2(name="Aisha") parent1.parent2 = parent2 child = Child() # 同时绑定两个父模型的child属性 parent1.child = child parent2.child = child db_session.add(parent1) db_session.commit()
方案2:添加事件监听实现自动填充(无需修改原有业务代码)
如果不想每次手动赋值两次,可以通过SQLAlchemy的事件监听机制,自动将Child实例关联到对应Parent2:
首先导入事件模块:
from sqlalchemy import event
然后添加监听函数:
@event.listens_for(Parent1, 'before_flush') def auto_bind_child_to_parent2(session, flush_context, instances): for instance in instances: if isinstance(instance, Parent1) and instance.child and instance.parent2: instance.parent2.child = instance.child
配置完成后,你原来的业务代码不需要做任何修改,提交时就会自动填充两个外键值,得到你预期的Child表数据。
内容的提问来源于stack exchange,提问作者adekability
相关产品推荐
相关产品推荐

