我正在尝试使用 Flask 和 SQLAlchemy 创建一对多关系。
我希望一对多关系是这样的:
“对于任何一部电影,都可以有多个角色”
这就是我目前所拥有的,但它现在正以一对一的形式保存在我的数据库中。 (一部电影对应一个角色,多个角色在DB中保存多次)
class Movie(db.Model):
__tablename__ = "movies"
id = db.Column('movies_id', db.Integer, primary_key=True)
movie_type = db.Column('movie_type', db.Text())
def __init__(self, movie_type):
self.movie_type = movie_type
def __repr__(self):
return '<Movie %r>' % self.id
class Character(db.Model):
__tablename__ = "characters"
id = db.Column('character_id', db.Integer, primary_key=True)
character_description = db.Column('character_description', db.Text())
movie_id = db.Column(db.Integer, db.ForeignKey('movies.movie_id'))
movie = db.relationship('Movie', backref='characters', lazy='dynamic')
def __init__(self, character_description, movie):
self.character_description = character_description
self.movie = movie
def __repr__(self):
return '<Character %r>' % self.id
我像这样保存到数据库中:
movie = models.movie(movie_type)
character = models.Character(character_description, movie)
db.session.add(movie)
db.session.add(character)
db.session.commit()
最终目标是能够查找某个角色在哪部电影中。如果您也能帮我解决这个问题,那就太好了!
提前致谢。
最佳答案
好吧,我想你错过了电影中的人物关系 + 插页并不完全正确。
还有一些小细节需要注意。为什么电影id是movieS_id,角色id是character_id?
此外,如果未指定,列的名称与变量的名称相同。
例如你可以这样做:
character_description = db.Column(db.Text())
无论如何,在不更改此详细信息的情况下,您可以尝试以下操作:
class Movie(db.Model):
__tablename__ = "movies"
id = db.Column('movies_id', db.Integer, primary_key=True)
movie_type = db.Column('movie_type', db.Text())
characters = db.relationship("Character", backref="movie", lazy='dynamic')
def __init__(self, movie_type):
self.movie_type = movie_type
def __repr__(self):
return '<Movie %r>' % self.id
class Character(db.Model):
__tablename__ = "characters"
id = db.Column('character_id', db.Integer, primary_key=True)
character_description = db.Column('character_description', db.Text())
movie_id = db.Column(db.Integer, db.ForeignKey('movies.movies_id'))
movie = db.relationship('Movie')
def __init__(self, character_description, movie):
self.character_description = character_description
self.movie = movie
def __repr__(self):
return '<Character %r>' % self.id
插入
c = Character(character_description='c')
c2 = Character(character_description='c2')
m = Movie(movie_type ='action')
# link characters to movie
m.characters.append(c)
m.characters.append(c2)
# or
m.characters.extend([c,c2])
db.session.add(m)
# add characters
db.session.add(c)
db.session.add(c2)
# or
db.session.add_all([c,c2])
# commit
db.session.commit()
关于python - 一对多 Flask | SQL炼金术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375179/