正在构建烧瓶应用程序。我有帖子和标签。发布帖子时,可以为该帖子选择许多标签(就像这里是堆栈溢出一样)。现在,问题出在要编辑帖子的位置。由于已有值,由于重复输入,我得到了sqlalchemy.exc.IntegrityError
。我尝试删除重复的条目,然后通过以下方式提交到数据库
post.tags = list(set(post.tags.all()))
,但是它仍然带来相同的错误。这是用于编辑帖子的查看功能:
@home.route('/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_post(id):
post = Post.query.get_or_404(id)
if current_user != post.author and not current_user.can(Permission.ADMINISTER):
abort(403)
form = PostForm()
form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
if form.validate_on_submit():
post.body = form.body.data
for id in form.tag.data:
post.tags.append(Tag.query.get(id))
db.session.commit()
return redirect(url_for('.view_post', id=post.id))
form.body.data = post.body
form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
form.tag.data = post.tags.all()
return render_template('home/edit_post.html', form=form, title='Edit Post')
请帮助我解决此问题,或为我提供更好的执行建议。考虑我是一个初学者。
答案 0 :(得分:0)
经过无数次尝试,我能够成功实施编辑。因此,首先我查询了该表中的所有类别,并使用帖子ID(返回元组列表)进行了过滤,例如[[62,1),(62,4)]。元组是(post_id,tag_id)。
categories = db.Table('categories', db.Column('post_id', db.Integer, db.ForeignKey('posts.id'), primary_key=True), db.Column('tag_id', db.Integer, db.ForeignKey('tags.id'), primary_key=True))
然后我自定义了一个元组,我用它来实现if条件,如果该元组存在于类别列表中,则将其忽略,并且仅将唯一的元组提交给数据库。
这是新的视图功能:
@home.route('/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_post(id):
post = Post.query.get_or_404(id)
if current_user != post.author and not current_user.can(Permission.ADMINISTER):
abort(403)
form = PostForm()
form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
if form.validate_on_submit():
post.body = form.body.data
# query the post-tag relationship for this post id
posttags = db.session.query(categories).filter_by(post_id=id).all()
for id in form.tag.data:
# custom tuple
if (post.id, id) not in posttags:
post.tags.append(Tag.query.get(id))
db.session.commit()
return redirect(url_for('.view_post', id=post.id))
form.body.data = post.body
form.tag.choices = [(tag.id, tag.name) for tag in Tag.query.order_by('name')]
form.tag.data = post.tags.all()
return render_template('home/edit_post.html', form=form, title='Edit Post')