我的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中删除建议时,出现错误。
风景:
@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。
我想到了!我在_upvote
路由内两次添加了“多对多”数组。
原始_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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句