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