python - query - AttributeError: el objeto ''int'' no tiene atributo ''_sa_instance_state''
sqlalchemy query (2)
Estoy trabajando en la plantilla del foro usando Flask. Cuando intento crear un nuevo hilo en el navegador utilizando formularios, SQLAlchemy lanza un AttributeError. El problema apareció cuando traté de implementar una relación uno a muchos con Forum-to-Thread y una relación de uno a muchos con 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''))
Todas las nuevas publicaciones / hilos y manejadas dentro de 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)
También es posible que el nombre del campo no esté apuntando correctamente:
class ThreadFrom(FlaskForm):
title = StringField(''title'', [validators.Length(max=128)])
author= StringField(''author'', [validators.Length(max=32)])
timestamp = DateField()
forum = SelectField()
En lugar de forum
debe ser forum_id
el problema es este:
post = Post(body=form.body.data,
timestamp=datetime.utcnow(),
thread=thread.id,
author=g.user.id)
Desea trabajar con objetos ORM, no con columnas de clave principal:
post = Post(body=form.body.data,
timestamp=datetime.utcnow(),
thread=thread,
author=g.user)
el error significa que un entero se interpreta como un objeto ORM.