Python 我如何将炼金术与多对多模型结合使用?
我想用炼金术建立一种多对多的关系,但我甚至连最简单的例子都会失败。我使用了链接中的示例代码,并在文件call app.py中添加了实现此功能的要素:Python 我如何将炼金术与多对多模型结合使用?,python,python-3.x,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Sqlalchemy,Flask Sqlalchemy,我想用炼金术建立一种多对多的关系,但我甚至连最简单的例子都会失败。我使用了链接中的示例代码,并在文件call 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
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"])
但我有一个错误:
AttributeError:“str”对象没有属性“\u sa\u instance\u 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()
非常高兴,我喜欢炼金术:-)
另外,由于有评论,您也可以这样做:
new_page = Page(page_name='Johnny Third', tags=[Tag(tag_name='Tag1Test'), Tag(tag_name='Tag2Test')])
从理论上讲,这也应该有效。起初,您提供的是字符串文字,而不是新构造的对象
new\u page=page(tags=[Tag(Tag\u name='Tag'])
我认为您缺少一个紧密的括号,只是根据您的想法尝试了一下,并获得了成功:-)谢谢您。。。。新建页面=第页(第三页),标签=[Tag(Tag_name='Tag1Test'),Tag(Tag_name='Tag2Test'))