python - 一对多 Flask | SQL炼金术

标签 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()

最终目标是能够查找某个角色在哪部电影中。如果您也能帮我解决这个问题,那就太好了!

提前致谢。

最佳答案

好吧,我想你错过了电影中的人物关系 + 插页并不完全正确。

还有一些小细节需要注意。为什么电影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/

相关文章:

python - sqlalchemy 中的简单更新

SqlAlchemy上一个/下一个访问器?

python - 为什么 getparent() 没有按预期工作?

python - 如何使用对任意数量的任意字段类型的引用来建模对象? (django orm)

flask - flask :前夕+ ACL

python - 如何在 python Flask-peewee 中反转外键

python - SQLAlchemy 中的多对一关系

python - 如何重新索引从 pandas read_html 检索到的格式错误的列?

python - 数组 : Insert with negative index

python - 为使用 Flask 发送的电子邮件创建一个安全的退订链接