【问题标题】:Flask SQLAlchemy 'str' object has no attribute '_sa_instance_state'Flask SQLAlchemy 'str' 对象没有属性 '_sa_instance_state'
【发布时间】:2018-12-23 09:05:36
【问题描述】:

我正在尝试使用 SQLAlchemy + Flask 将项目添加到我的数据库中,但不断收到错误消息。

class users(db.Model):
    userid = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80))
    email = db.Column(db.String(120))
    password = db.Column(db.String(80))
    duguns = db.relationship('dugun', backref='whuser', lazy='dynamic')
    yorums = db.relationship('yorum', backref='whuser', lazy='dynamic')
    genels = db.relationship('genel', backref='whuser', lazy='dynamic')
    bilgis = db.relationship('bilgi', backref='whuser', lazy='dynamic')

class bilgi(db.Model):
    kisiselid = db.Column(db.Integer, primary_key=True)
    userid = db.Column(db.Integer, db.ForeignKey('users.userid'))
    gelinAdi = db.Column(db.String(80))
    damatAdi = db.Column(db.String(80))
    gelinFoto = db.Column(db.String(80))
    damatFoto = db.Column(db.String(80))
    gelinBio = db.Column(db.String(120))
    damatBio = db.Column(db.String(80))



@app.route("/admin", methods=["GET","POST"])
@login_required
def admin():
    form = KisiForm(request.form)
    if request.method == "POST":
        gelinAdi = form.gelinAdi.data
        gelinFoto = form.gelinFoto.data
        gelinBio = form.gelinBio.data
        damatAdi = form.damatAdi.data
        damatFoto = form.damatFoto.data
        damatBio = form.damatBio.data
        whuser = session["username"]

        kisi = bilgi(whuser = whuser, gelinAdi = gelinAdi, gelinFoto = gelinFoto, gelinBio = gelinBio, damatAdi = damatAdi, damatFoto = damatFoto, damatBio = damatBio)
        db.session.add(kisi)
        db.session.commit()
        return redirect(url_for("admin"))

    return render_template("admin/index.html",form=form)

这就是代码。当我运行 Python 文件时,出现此错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/bozkurt/Desktop/davetiye/site.py", line 70, in decorated_function
    return f(*args, **kwargs)
  File "/Users/bozkurt/Desktop/davetiye/site.py", line 172, in admin
    kisi = bilgi(whuser = whuser, gelinAdi = gelinAdi, gelinFoto = gelinFoto, gelinBio = gelinBio, damatAdi = damatAdi, damatFoto = damatFoto, damatBio = damatBio)
  File "<string>", line 4, in __init__

  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/state.py", line 417, in _initialize_instance
    manager.dispatch.init_failure(self, args, kwargs)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 249, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/state.py", line 414, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/base.py", line 700, in _declarative_constructor
    setattr(self, k, kwargs[k])
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 229, in __set__
    instance_dict(instance), value, None)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 813, in set
    value = self.fire_replace_event(state, dict_, value, old, initiator)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 833, in fire_replace_event
    state, value, previous, initiator or self._replace_token)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 1181, in emit_backref_from_scalar_set_event
    child_state, child_dict = instance_state(child),\
AttributeError: 'str' object has no attribute '_sa_instance_state'

AttributeError: 'str' object has no attribute '_sa_instance_state。我该怎么办?

【问题讨论】:

  • 请您添加完整的回溯以识别错误吗?此外,bilgi 模型的 whuser 是什么?

标签: python sqlalchemy


【解决方案1】:

您将列定义为反向引用:

bilgis = db.relationship('bilgi', backref='whuser', lazy='dynamic')

表示值they're set to represents an ORM object - 不是单个字符串。但是,您在创建对象时只发送字符串(用户名):

whuser = session["username"]
kisi = bilgi(whuser = whuser, ...)

确保提供从 ORM 返回的用户对象:

bilig(whuser=<actual user object from the ORM>, ..)

您可以通过首先从 ORM 中获取用户来做到这一点:

user = users.query.filter_by(username=whuser).first()

然后在创建依赖对象时使用该值:

bilig(whuser=user, ..)

【讨论】:

  • whuser = session["username"] - 您自己在这里设置值。如果前面有查询,直接使用 session var。
  • 我遇到了与上述相同的问题,无法重现该解决方案。也许我不明白你的意思是确保提供从ORM返回的用户对象:?这是我设置的类似应用程序dpaste.com/CF7YLX27P。错误源于post = Post(body = form.comment.data, author = user.username) 请解释为什么您建议进行上述更改以修复错误
  • @GitauHarrison 您的author 被定义为User 类实例的反向引用。你给它一个字符串(user.username 值)。 author=user 将是对从 ORM 返回的实际用户类的引用(即 ORM 中存在的对象,而不是字符串形式的用户名)。
  • 对自己和其他人的注意事项:非常小心,以确保您不会意外地将列名和关系属性名设置为相同的名称。我花了两个小时想弄清楚为什么会发生这种情况。结果我的用户模型有一个电子邮件列以及与电子邮件表的电子邮件关系(原因是该列用于注册目的,而电子邮件表是将电子邮件对象映射到多个用户,多对多关系)
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2021-12-27
  • 2022-11-06
  • 1970-01-01
  • 2016-11-14
  • 2014-12-29
相关资源
最近更新 更多