2016-05-19 15 views
0

私は3つのテーブル:User,DepartmentおよびUsers_Departmentsを持っています。私がうまく働いているidのユーザーと部門に加わることに加えて、Users_Departmentsにブール値を設定することで、ユーザーの1人を部門長として設定する必要があります。SQLAlchemyでテーブルを結合する値を追加する方法は?

私は、ユーザーや部門の両方に関係設定した:

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')) 

しかし、私は、私は部門とvice-にユーザーを追加するときUsers_Departmentsで定義されているブール値を設定する方法がわかりませんのその逆。

+0

注: 'backref'の代わりに、' back_populates'との関係を定義し、あなたは関係の一方の側でそれを定義する必要があります。ドキュメント[here](http://docs.sqlalchemy.org/en/latest/orm/backref.html#linking-relationships-with-backref)を参照してください。 –

答えて

1

あなたはassocation objectを使用することができます。

「関連オブジェクトパターンが多対多の変種です:それはあなたの関連テーブルが を超える追加の列に外部キーであるものが含まれている場合に使用 です左右のテーブル。

この場合、あなたはORMオブジェクトとしてusers_departmentsテーブルを定義できます:viewonlyフラグがTrueを設定すると、私は、secondaryとしてこのようなテーブルを使用して成功を収めている

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') 

。でリンクドキュメントを

>>> x = UserDepartment(user_id=n, department_id=m, is_manager=False) 
>>> db.session.add(x) 
>>> db.session.commit() 

ルック:これは、実際の変更がusers_departmentsテーブルの上に直接行われ、読み取り専用の関係を定義し

departments = db.relationship('Department', 
    secondary='users_departments', 
    viewonly=True, 
    backref=db.backref('users', viewonly=True, lazy='dynamic'), 
    lazy='dynamic') 

:だからUsersクラスの関係を定義することができますこの投稿の最初の部分はなぜviewonlyが良い考えであるかを理解する。 viewonlyのドキュメント自体はhereです。

またUserクラスの列users.department_assocを定義することができます。

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() 
関連する問題