一对多烧瓶| SQLAlchemy的

时间:2014-08-19 03:14:27

标签: python flask sqlalchemy one-to-many flask-sqlalchemy

我正在尝试使用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()

最终目标是能够查找角色所在的电影。如果你也可以帮我解决这个问题,那就太棒了!

提前致谢。

1 个答案:

答案 0 :(得分:6)

好吧,我觉得你错过了电影中的角色关系+插入不是完全正确的。

还有一些细节,你必须要小心。为什么电影的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()