我有3个表:User
,Department
和Users_Departments
。除了加入我运行良好的id的用户和部门之外,我还需要通过在Users_Departments上设置一个布尔值来将其中一个用户设置为部门负责人。
我已经为用户和部门配置了关系:
departments = db.relationship('Department', secondary=users_departments, backref=db.backref('users', lazy='dynamic'))
users = db.relationship('User', secondary=users_departments, backref=db.backref('departments', lazy='dynamic'))
但是当我将用户添加到部门时,我不知道如何设置在Users_Departments中定义的布尔值,反之亦然。
答案 0 :(得分:1)
您可以使用assocation object:
"关联对象模式是多对多的变体:它是 当关联表包含其他列时使用 那些是左右表的外键。"
在这种情况下,您可以将users_departments
表定义为ORM对象:
class UserDepartment(db.Model): # Since we're using Flask-SQLAlchemy
__tablename__ = 'users_departments'
user_id = db.Column(db.Integer, ForeignKey('users.id'), primary_key=True)
department_id = db.Column(db.Integer, ForeignKey('departments.id'), primary_key=True)
is_manager = db.Column(db.Boolean)
user = relationship('User', back_populates='department_assoc')
department = relationship('Department', back_populates='user_assoc')
我使用secondary
这样的表格成功,viewonly
标志设置为True
。因此,您可以在Users
类中定义关系:
departments = db.relationship('Department',
secondary='users_departments',
viewonly=True,
backref=db.backref('users', viewonly=True, lazy='dynamic'),
lazy='dynamic')
这定义了一个只读关系,其中实际更改直接在users_departments
表上进行:
>>> x = UserDepartment(user_id=n, department_id=m, is_manager=False)
>>> db.session.add(x)
>>> db.session.commit()
查看本文开头链接的文档,了解为什么viewonly
是一个好主意。 viewonly
本身的文档是here。
您还可以在users.department_assoc
类中定义列User
:
department_assoc = db.relationship('UserDepartment', back_populates='user')
并进行更改:
>>>> some_user = User.query.get(n)
>>>> some_user.department_assoc.append(UserDepartment(department_id=m, is_manager=False))
>>>> db.session.commit()