如何将 Flask-SQLAlchemy 与多对多模型一起使用?



我想使用Flask-SQLAlchemy创建一个多对多关系,但即使是最简单的例子也失败了。 我使用了此处链接中的示例代码,并添加了在文件调用 app.py 中获取此功能的基本要素:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
db.Column('page_id', db.Integer, db.ForeignKey('page.id'), primary_key=True)
)
class Page(db.Model):
id = db.Column(db.Integer, primary_key=True)
page_name = db.Column(db.String(30))
tags = db.relationship('Tag', secondary=tags, lazy='subquery',
backref=db.backref('pages', lazy=True))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
tag_name = db.Column(db.String(30))

然后我在 Python 命令行中键入:

from app import * 
db.create_all()

它已正确创建文件,我可以看到三个表。 完善!

我现在如何创建此示例中的页面和标签...我期望像这样:

new_page = Page(tags=["tagone"])

但是我得到一个错误:

属性

错误:"str"对象没有属性"_sa_instance_state

我不知道从哪里开始说实话..

我通过更多的搜索和测试弄清楚了。 我不确定这是否是最佳实践,但它有效:

new_page_too = Page(page_name='Johnny New')
new_tag = Tag(tag_name='Solved')
new_tag_too = Tag(tag_name='Fixed It!')
new_page_too.tags.append(new_tag)
new_page_too.tags.append(new_tag_too)
db.session.add(new_page_too)
db.session.commit()

非常高兴,我喜欢SQLAlchemy:-(

也多亏了评论,您也可以这样做:

new_page = Page(page_name='Johnny Third', tags=[Tag(tag_name='Tag1Test'), Tag(tag_name='Tag2Test')])

最新更新