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
添加到模型中。我错过了什么?这让我兴奋不已!
编辑: 在python解释器中,我尝试了以下内容。
s = Suggestion.query.first()
for v in s.voters.all():
s.voters.remove(v)
s.voters.all()
然后崩溃并产生相同的StaleDataError。
答案 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()