[英]Flask-SQLAlchemy Many to Many Insert
Flask sqlalchemy many-to-many insert data Flask SQLAlchemy多对多插入数据
I've tried the above advice but continue to recieve the following error on the append of a many to many attribute when inserting a new post with tags. 我已经尝试了上述建议,但是在插入带有标签的新帖子时,在多对多属性的追加中继续收到以下错误。
Any direction would be most appreciated! 任何方向将不胜感激!
1:06:22 PM web.1 |
下午1:06:22 web.1 | post.tags.append(post_tag)
post.tags.append(post_tag)
11:06:22 PM web.1 |
下午11:06:22 web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1072, in append
附录中的文件“ /home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py”,第1072行
11:06:22 PM web.1 |
下午11:06:22 web.1 | item = __set(self, item, _sa_initiator)
物品= __set(自我,物品,_sa_initiator)
11:06:22 PM web.1 |
下午11:06:22 web.1 | File "/home/trevor/Projects/trevorblog/venv/local /lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1044, in __set
__set中的文件“ / home / trevor / Projects / trevorblog / venv / local /lib/python2.7/site-packages/sqlalchemy/orm/collections.py”,第1044行
11:06:22 PM web.1 |
下午11:06:22 web.1 | item = executor.fire_append_event(item, _sa_initiator)
item = executor.fire_append_event(项目,_sa_initiator)
11:06:22 PM web.1 |
下午11:06:22 web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 716, in fire_append_event
在fire_append_event中的文件“ /home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py”,第716行
11:06:22 PM web.1 |
下午11:06:22 web.1 | item, initiator)
项目,发起人)
11:06:22 PM web.1 |
下午11:06:22 web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 936, in fire_append_event
文件“ /home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py”,行936,在fire_append_event中
11:06:22 PM web.1 |
下午11:06:22 web.1 | initiator or self._append_token or self._init_append_token())
启动器或self._append_token或self._init_append_token())
11:06:22 PM web.1 |
下午11:06:22 web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 1171, in emit_backref_from_collection_append_event
文件“ /home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py”,行1171,位于emit_backref_from_collection_append_event中
11:06:22 PM web.1 |
下午11:06:22 web.1 | child_state, child_dict = instance_state(child), \\
child_state,child_dict = instance_state(child),\\
11:06:22 PM web.1 |
下午11:06:22 web.1 | AttributeError: 'BaseQuery' object has no attribute '_sa_instance_state'
AttributeError:“ BaseQuery”对象没有属性“ _sa_instance_state”
Model.py Model.py
blog_tag = db.Table('post_tag',
db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Post(db.Model):
"""SQLAlchemy Post object class"""
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
timestamp = db.Column(db.DateTime)
title = db.Column(db.String(50))
author = db.Column(db.Integer, db.ForeignKey('user.id'))
uuid = db.Column(db.String(255))
tags = db.relationship('Tag',secondary=blog_tag,
back_populates="posts")
class Tag(db.Model):
"""SQLAlchemy Tag object class"""
id=db.Column(db.Integer, primary_key=True)
name=db.Column(db.String, unique=True, nullable=False)
posts = db.relationship('Post', secondary = blog_tag,
back_populates = "tags")
Views.py Views.py
@console.route('/new_post', methods=['GET', 'POST'])
@login_required
def new_post():
post_form = PostForm()
if post_form.validate_on_submit():
"""Take the list of tags and turn them into an array"""
uid = uuid.uuid4()
post = Post()
post.title = post_form.title.data
post.body = post_form.body.data
post.timestamp = datetime.utcnow()
post.author = current_user.id
post.uuid = uid.hex
tag_string = post_form.tags.data
tags = tag_string.split(",")
for tag in tags:
post_tag = add_tags(tag)
print post_tag
post.tags.append(post_tag)
db.session.add(post)
db.session.commit()
flash (u'New Post Created!', 'alert-info')
return render_template('new_post.html',
title='Admin-New Post',
form=post_form)
def add_tags(tag):
existing_tag = Tag.query.filter(Tag.name == tag.lower())
"""if it does return existing tag objec to list"""
if existing_tag is not None:
return existing_tag
else:
new_tag = Tag()
new_tag.name = tag.lower()
return new_tag
This: 这个:
existing_tag = Tag.query.filter(Tag.name == tag.lower())
"""if it does return existing tag objec to list"""
if existing_tag is not None:
return existing_tag
does not return a Tag
, but a Query
. 不返回
Tag
,而是Query
。 You want to Tag.query.filter(...).one_or_none()
to get the tag itself. 您想要
Tag.query.filter(...).one_or_none()
来获取标签本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.