orm - 如何通过多对多关系链接两个现有记录
问题描述
我需要添加roles
到staff
,以下代码有效,但不知何故它不允许将相同的角色添加到多个员工。如果再次分配相同的角色,则从辅助表中删除先前的分配!为什么会这样
staff_roles = Table('staff_roles', Base.metadata,
Column('staff_id', Integer, ForeignKey('staff.id')),
Column('role_id', Integer, ForeignKey('roles.id'))
)
class Staff(Base):
__tablename__="staff"
id= Column(Integer, primary_key=True, index=True)
img= Column(String)
civil_id= Column(Integer)
nationality= Column(String)
disabled= Column(Boolean, default=False)
created_at= Column(DateTime)
updated_at= Column(DateTime)
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
roles = relationship("Roles", uselist=True, secondary=staff_roles, back_populates="staff", lazy='raise')
class Roles(Base):
__tablename__="roles"
id= Column(Integer, primary_key=True, index=True)
name= Column(String)
staff = relationship("Staff", uselist=False, secondary=staff_roles, back_populates="roles", lazy='raise')
def add_role_to_staff(db: Session, user_id:int, role_ids:list):
roles = db.query(tables.Roles).options(joinedload(tables.Roles.staff)).filter(tables.Roles.id.in_(role_ids)).all()
staff = db.query(tables.Staff).options(joinedload(tables.Staff.roles)).filter(tables.Staff.user_id == user_id).first()
if len(roles) == 0 or staff is None:
raise HTTPException(status_code=404, detail="role or staff does not exist")
for role in roles:
staff.roles.append(role)
try:
db.commit()
except IntegrityError as e:
db.rollback()
process_db_error(e)
从日志:
INFO:sqlalchemy.engine.base.Engine:DELETE FROM staff_roles WHERE staff_roles.staff_id = %(staff_id)s AND staff_roles.role_id = %(role_id)s
INFO:sqlalchemy.engine.base.Engine:{'staff_id': 2, 'role_id': 2}
INFO:sqlalchemy.engine.base.Engine:INSERT INTO staff_roles (staff_id, role_id) VALUES (%(staff_id)s, %(role_id)s)
INFO:sqlalchemy.engine.base.Engine:{'staff_id': 1, 'role_id': 2}
INFO:sqlalchemy.engine.base.Engine:COMMIT
为什么要删?!
解决方案
这很有趣,问题Roles
在关系表中staff
。uselist
应该是True
。
推荐阅读
- python - 我不断收到keyerror,但我已经在外面测试过它并且它有效
- marklogic - 光学查询中的最后一天
- javascript - 如何使用 JSObject - iframe 中的 Flutter 上下文调用自定义 JavaScript 函数?
- parsing - Lark : 如何只挑选一些图案
- angular - 无法使用 Angular CLI 创建基本项目
- python - 有没有办法在不使用 for 循环的情况下从两个数组形成一个列表?
- reactjs - 每当我调用材料 ui 组件时,我都会收到 React 钩子错误
- php - 是否可以将 TinyMCE 文本编辑器集成到 Android 应用程序中?
- python - 使用python etree中的值对XML进行排序
- node.js - 更新到 npm v7 时,npm update 在我的应用程序中不起作用?