烧瓶数据库模型 1:M 关系



我正在尝试连接 Flask 中的两个表。SQLite 从第一个表("用户"(获取输入,但是当尝试从第二个表("反馈"(获取输入时,我收到此错误:

sqlalchemy.exc.IntegrityError: (sqlite3.完整性错误( 非空约束失败:feedback.user_id

from fimekapp import db, login_manager
from flask_login import UserMixin
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class User (db.Model, UserMixin):
id = db.Column (db.Integer, primary_key=True)
username = db.Column (db.String(20), unique=True, nullable=False)
email = db.Column (db.String(120), unique=True, nullable=False)
password = db.Column (db.String(60), nullable=False)
feedbacks = db.relationship ('Feedback', backref='author', lazy=True)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
class Feedback(db.Model):
id = db.Column(db.Integer, primary_key=True)
student = db.Column(db.String(100), nullable=False)
grade = db.Column(db.Integer, nullable=False)
comment = db.Column(db.Text())
date_posted = db.Column (db.DateTime, nullable=False, default=datetime.utcnow)
user_id = db.Column (db.Integer, db.ForeignKey('user.id'), nullable=False)
def __repr__(self):
return f"User('{self.student}', '{self.grade}', {self.comment}')"

这些是我的路线:

@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
hashed_pw = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
new_user = User(username=form.user.data, email=form.email.data, password = hashed_pw)
db.session.add(new_user)
db.session.commit()
flash('Account created!', 'success')
return redirect(url_for('login'))
return render_template('register.html', title='Registration', form=form)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
new_user = User.query.filter_by(email=form.email.data).first()
if new_user and bcrypt.check_password_hash(new_user.password, form.password.data):
login_user(new_user, remember=form.remember.data)
return redirect(url_for('feedback'))
else:
flash('Unable to login! Check your email and password.', 'danger')
return render_template('login.html', title='Login', form=form)
@app.route('/feedback', methods=['GET', 'POST'])
@login_required
def feedback():
form = FeedbackForm()
if form.validate_on_submit():
new_feedback = Feedback(student=form.student.data, grade=form.grade.data, comment=form.komentar.data)
db.session.add(new_feedback)
db.session.commit()
flash('OK!', 'success')
return redirect(url_for('home'))
return render_template('feedback.html', title='Feedback', form=form)

如您所见,我对此很陌生,所以如果我没有看到明显的东西,请原谅我。 谢谢!

问题就在这里:

new_feedback = Feedback(student=form.student.data, grade=form.grade.data, comment=form.komentar.data)
db.session.add(new_feedback)
db.session.commit()

您需要设置new_feedback.authoruser_id作为关键字传递给Feedback

它失败,因为您将"反馈"上的"user_id"列设置为nullable=False

最新更新