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
반응형