如何使用SQLAlchemy为表连接添加值?

时间:2016-05-19 20:13:09

标签: python postgresql sqlalchemy flask-sqlalchemy

我有3个表:UserDepartmentUsers_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中定义的布尔值,反之亦然。

1 个答案:

答案 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()