IT/파이썬

[플라스크] 다대다 관계 모델 설정 (SQLAlchemy)

thesse 2021. 5. 31. 18:00
300x250
반응형

models.py

class Question(db.Model): 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'), nullable=False)
    user = db.relationship('User', backref=db.backref('question_set'))
    ...

class User(db.Model):
    ...

위와 같이 kf로 참조되는 두 테이블을 다대다로 만들고자 한다.

 

 

models.py

question_voter = db.Table(
    'question_voter',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'), primary_key=True),
    db.Column('question_id', db.Integer, db.ForeignKey('question.id', ondelete='CASCADE'), primary_key=True)
)

 

다대다로 연결할 두 테이블의 pk로 이루어진 참조 테이블을 설정한다.

이때 참조 테이블은 class로 선언되는게 아니고 db.Table()을 통해 정의된 객체이다.

이 객체를 Question 모델에 필드로 추가해준다.

 

class Question(db.Model): 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'), nullable=False)
    user = db.relationship('User', backref=db.backref('question_set'))
    ...
    voter = db.relationship('User', secondary=question_voter, backref=db.backref('question_voter_set'))

user와 유사하게 relationshp으로 backref까지 지정되어 있다.

차이점으로 secondary 설정이 추가되어있는데

이를 통해 voter가 다대다 관계이며 queston_voter 테이블을 참조함을 알 수 있다.

 

 

question에 대해 참조객체를 만들었으면 answer에 대해서도 마찬가지로

answer_voter 객체를 만들고 class Answer(db.Model)에 voter를 추가해준다.

 

이후 flask db migrate -> upgrade

300x250
반응형