AttributeError: l'objet 'int' n'a pas d'attribut 'sa instance state'
je travaille sur le modèle de forum en utilisant flasque. Quand je tente de créer un nouveau fil dans le navigateur en utilisant des formes, SQLAlchemy lance un AttributeError. Le problème est apparu lorsque j'ai essayé de mettre en place une relation un-à-plusieurs avec Forum-to-Thread et une relation un-à-plusieurs avec Thread-to-User.
models.py
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), index=True, unique=True)
password = db.Column(db.String(32), index=True)
email = db.Column(db.String(120), index=True, unique=True)
role = db.Column(db.SmallInteger, default=ROLE_USER)
posts = db.relationship('Post', backref='author', lazy='dynamic')
class Forum(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128))
description = db.Column(db.Text)
threads = db.relationship('Thread', backref='forum', lazy='dynamic')
class Thread(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128))
author= db.Column(db.String(32))
timestamp = db.Column(db.DateTime)
forum_id = db.Column(db.Integer, db.ForeignKey('forum.id'))
posts = db.relationship('Post', backref='thread', lazy='dynamic')
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
timestamp = db.Column(db.DateTime)
thread_id = db.Column(db.Integer, db.ForeignKey('thread.id'))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
tous les nouveaux messages / threads et traités dans views.py
views.py
@app.route('/forum/id=<id>/submit', methods=['GET','POST'])
@login_required
def new_thread(id):
form = ThreadForm()
forum = Forum.query.filter_by(id=id).first()
if form.validate_on_submit():
thread = Thread(title=form.title.data,
author=g.user.username,
timestamp=datetime.utcnow())
db.session.add(thread)
db.session.flush()
post = Post(body=form.body.data,
timestamp=datetime.utcnow(),
thread=thread.id,
author=g.user.id)
db.session.add(post)
db.session.commit()
flash('Post successful.')
return redirect(url_for('forum_index', id=id))
return render_template('forum/thread_submit.html', title=forum.title, form=form)
35
demandé sur
Ganye
2013-04-22 20:12:27
2 réponses
le problème est le suivant:
post = Post(body=form.body.data,
timestamp=datetime.utcnow(),
thread=thread.id,
author=g.user.id)
vous voulez travailler avec des objets ORM, pas des colonnes de clés primaires:
post = Post(body=form.body.data,
timestamp=datetime.utcnow(),
thread=thread,
author=g.user)
l'erreur signifie qu'un entier est interprété comme un ORM objet.
52
répondu
zzzeek
2013-04-22 17:19:36
il se peut aussi que le nom du champ ne pointe pas correctement:
class ThreadFrom(FlaskForm):
title = StringField('title', [validators.Length(max=128)])
author= StringField('author', [validators.Length(max=32)])
timestamp = DateField()
forum = SelectField()
au Lieu de forum
doit être forum_id
-1
répondu
jkaluzka
2017-11-21 14:43:49