这个错误可能是因为使用不正确的查询,以及尝试在 Int 实例上设置实例状态。解决方法是确保你正在正确查询对象,并在选择多个字段中使用字符串而不是整数作为值。或者,如果你真的想使用整数,请首先将其转换为字符串。下面是使用 Flask,SQLAlchemy 和 WTF SelectMultipleField 的示例代码,可以帮助避免这个错误:
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from wtforms import SelectMultipleField, widgets
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
association_table = db.Table('association', db.Model.metadata,
db.Column('student_id', db.Integer, db.ForeignKey('student.id')),
db.Column('class_id', db.Integer, db.ForeignKey('class.id'))
)
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
classes = db.relationship('Class', secondary=association_table, backref=db.backref('students', lazy='dynamic'))
class Class(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
class MultiCheckboxField(SelectMultipleField):
widget = widgets.ListWidget(prefix_label=False)
option_widget = widgets.CheckboxInput()
@app.route('/', methods=['GET', 'POST'])
def index():
form = StudentForm(request.form)
form.classes.choices = [(str(c.id), c.name) for c in Class.query.all()]
if request.method == 'POST' and form.validate():
student = Student(name=form.name.data)
for class_id in form.classes.data:
student.classes.append(Class.query.get(int(class_id)))
db.session.add(student)
db.session.commit()
students = Student.query.all()
return render_template('index.html', form=form, students=students)
class StudentForm(FlaskForm):
name = StringField('Name')
classes = MultiCheckboxField('Classes')
if __name__ ==