简体   繁体   English

如何在具有多对多关系的SQLAlchemy表中插入数据?

[英]How to insert data in SQLAlchemy tables with many-to-many relationship?

I know that this issue was there. 我知道这个问题在那里。 But I ask you to help me with this example. 但我请您在这个例子中为我提供帮助。 I have this model: 我有这个模型:

ItemTable = Table('ItemTable', Base.metadata,
    Column('post_id', Integer, ForeignKey('post.id')),
    Column('tags_id', Integer, ForeignKey('tag.id')))

class Post(Base):

    __tablename__ = 'post'
    id = Column(Integer, primary_key = True)
    title = Column(Text)
    body = Column(Text)
    timestamp = Column(DateTime, default=datetime.datetime.utcnow())
    user_id = Column(Integer, ForeignKey(User.id))
    tags = relationship('Tag', secondary=ItemTable, backref='post')

    def __init__(self,title=None,body=None):
        self.title = title
        self.body = body

    def __repr__(self):
        return '<Post %r>' % (self.title)

class Tag (Base):
    __tablename__ = 'tag'
    id = Column (Integer, primary_key = True)
    title = Column (Text)
    posts = relationship ('Post', secondary=ItemTable, backref='tag')

    def __init__(self,title=None):
        self.title = title

    def __repr__(self):
        return '<Tag %r>' % (self.title)

I tried to add a post with few tags. 我试图添加带有少量标签的帖子。 How can I do it rightly? 我该怎么做呢? If I do it like this, I get the error: 如果我这样做,则会收到错误消息:

AttributeError: 'str' object has no attribute '_sa_instance_state' AttributeError:“ str”对象没有属性“ _sa_instance_state”

class AddPost(BaseView):
def is_accessible(self):
    return g.user.is_authenticated()
@expose('/', methods=('GET', 'POST'))
def addpost_view(self):
    if not g.user.is_authenticated():
        return redirect(url_for('AdminView.login_view'))
    form = PostForm()
    if helpers.validate_form_on_submit(form):
        p=Post(title=form.title.data, body=form.text.data)
        for tag in form.tags.data.split(','):
            p.tags.append(tag)
        db_session.add(p)
        db_session.commit()
    self._template_args['form'] = form
    return self.render('admin/addpost.html')

You are appending strings to the Post object instead of Tag objects. 您将字符串附加到Post对象而不是Tag对象。 The problem is here: 问题在这里:

for tag in form.tags.data.split(','):
    p.tags.append(tag)

And it should look somehow like this: 它看起来应该像这样:

for t in form.tags.data.split(','):
    tag = Tag(....)
    p.tags.append(tag)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM