Flask-SQLAlchemy多对多插入 [英] Flask-SQLAlchemy Many to Many Insert

查看:78
本文介绍了Flask-SQLAlchemy多对多插入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

烧瓶sqlalchemy多对多插入数据

我已经尝试了上述建议,但是在插入带有标签的新帖子时,在多对多属性的追加中继续收到以下错误.

任何方向将不胜感激!

1:06:22 PM web.1 | post.tags.append(post_tag)

11:06:22 PM web.1 |附上文件"/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py",第1072行

11:06:22 PM web.1 |item = __set(自身,item,_sa_initiator)

11:06:22 PM web.1 |在__set

中的文件"/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py",第1044行

11:06:22 PM web.1 |item = executor.fire_append_event(item,_sa_initiator)

11:06:22 PM web.1 |在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 PM web.1 |在fire_append_event中的文件"/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py"中,行936

11:06:22 PM web.1 |启动器或self._append_token或self._init_append_token())

11:06:22 PM web.1 |在第1171行"中的"/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py"文件中,在"eject_backref_from_collection_append_event"中

11:06:22 PM web.1 |child_state,child_dict = instance_state(child),\

11:06:22 PM web.1 |AttributeError:"BaseQuery"对象没有属性"_sa_instance_state"

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')))类Post(db.Model):""SQLAlchemy Post对象类""id = db.Column(db.Integer,primary_key = True)正文= db.Column(db.Text)时间戳= db.Column(db.DateTime)标题= db.Column(db.String(50))作者= db.Column(db.Integer,db.ForeignKey('user.id'))uuid = db.Column(db.String(255))标签= db.relationship('标签',次要= blog_tag,back_populates =帖子")类Tag(db.Model):""SQLAlchemy标签对象类""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 =标签") 

Views.py

  @ console.route('/new_post',methods = ['GET','POST'])@需要登录def new_post():post_form = PostForm()如果post_form.validate_on_submit():获取"标签列表,并将其转换为数组.uid = uuid.uuid4()post = Post()post.title = post_form.title.datapost.body = post_form.body.datapost.timestamp = datetime.utcnow()post.author = current_user.idpost.uuid = uid.hextag_string = post_form.tags.data标签= tag_string.split(,")用于标签中的标签:post_tag = add_tags(标签)打印post_tagpost.tags.append(post_tag)db.session.add(post)db.session.commit()flash(u创建新帖子!","alert-info")返回render_template('new_post.html',title ='管理员-新帖子',形式= post_form)def add_tags(标签):existing_tag = Tag.query.filter(Tag.name == tag.lower())如果确实将现有标签objec返回到列表",则返回".如果exist_tag不为None:返回现存的标签别的:new_tag =标签()new_tag.name = tag.lower()返回new_tag 

解决方案

此:

  existing_tag = Tag.query.filter(Tag.name == tag.lower())"如果确实将现有标签objec返回列表""如果exist_tag不为None:返回现存的标签 

不返回 Tag ,而是返回 Query .您要 Tag.query.filter(...).one_or_none()来获取标签本身.

Flask sqlalchemy many-to-many insert data

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 | post.tags.append(post_tag)

11:06:22 PM web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1072, in append

11:06:22 PM web.1 | item = __set(self, item, _sa_initiator)

11:06:22 PM web.1 | File "/home/trevor/Projects/trevorblog/venv/local /lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1044, in __set

11:06:22 PM web.1 | item = executor.fire_append_event(item, _sa_initiator)

11:06:22 PM web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 716, in fire_append_event

11:06:22 PM web.1 | item, initiator)

11:06:22 PM web.1 | File "/home/trevor/Projects/trevorblog/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 936, in fire_append_event

11:06:22 PM web.1 | initiator or self._append_token or self._init_append_token())

11:06:22 PM 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

11:06:22 PM web.1 | child_state, child_dict = instance_state(child), \

11:06:22 PM web.1 | AttributeError: 'BaseQuery' object has no attribute '_sa_instance_state'

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

@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. You want to Tag.query.filter(...).one_or_none() to get the tag itself.

这篇关于Flask-SQLAlchemy多对多插入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆