Flask SQLAlchemy多对多删除元素

时间:2016-01-16 00:22:45

标签: python flask sqlalchemy flask-sqlalchemy

My Flask网站有建议和用户。

class Suggestion(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_nickname = db.Column(db.Integer, db.ForeignKey('user.nickname'))
    voters = db.relationship('User', secondary=votes, lazy='dynamic')

class User(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    suggestions = db.relationship('Suggestion', backref='user', lazy='dynamic')
    votes = db.relationship('Suggestion', secondary=votes, lazy='dynamic') 

我已经建立了两者之间的多对多关系。

votes = db.Table('votes',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('suggestion_id', db.Integer, db.ForeignKey('suggestion.id'))
)

当我尝试删除views.py中的Suggestion时出现错误。

观点:

@app.route('/_delete_suggestion', methods=['GET', 'POST'])
    def delete_suggestion():
    user_nickname = request.form.get('user_nickname')
    user = User.query.filter_by(nickname=user_nickname).first()
    sugg_id = request.form.get('sugg_id')
    sugg = Suggestion.query.filter_by(id=sugg_id).first()
    if user.is_special:
        db.session.delete(sugg)
        db.session.commit()
    else:
        flash('You are not cool enough to do that!')
        return redirect(url_for('index'))
    return

@app.route('/_upvote', methods=['GET', 'POST'])
    def upvote():
    user_nickname = request.form.get('user_nickname')
    user = User.query.filter_by(nickname=user_nickname).first()
    sugg_id = request.form.get('sugg_id')
    sugg = Suggestion.query.filter_by(id=sugg_id).first()
    if sugg.voters.filter_by(nickname=user_nickname).first() is not None:
        print("ERR", file=sys.stderr)
    else:
        print("VOTED", file=sys.stderr)
        sugg.score += 1
        sugg.voters.append(user)
        user.votes.append(sugg)
        db.session.add(sugg)
        db.session.add(user)
        db.session.commit()
    return

错误:

StaleDataError: DELETE statement on table 'votes' expected to delete 2 row(s); Only 4 were matched.

我所知道的:

  • 我可以删除没有任何投票的建议。

我尝试过的事情:

  • 我尝试将view-only=True添加到模型中。
  • 我尝试删除所有建议的选民,并在删除之前删除所有用户投票的建议。
  • 我一直在查看StackOverflow和Google上与此问题相关的所有帖子,但没有任何运气。

我错过了什么?这让我兴奋不已!

编辑: 在python解释器中,我尝试了以下内容。

s = Suggestion.query.first()
for v in s.voters.all():
    s.voters.remove(v)
s.voters.all()

然后崩溃并产生相同的StaleDataError。

1 个答案:

答案 0 :(得分:0)

我明白了!我在_upvote路由中两次添加到Many to Many数组。

原始_upvote摘要:

print("VOTED", file=sys.stderr)
sugg.score += 1
sugg.voters.append(user)
user.votes.append(sugg)
db.session.add(sugg)
db.session.add(user)
db.session.commit()

已修复_upvote代码段

print("VOTED", file=sys.stderr)
sugg.score += 1
sugg.voters.append(user)
db.session.add(sugg)
db.session.commit()