【问题标题】:SQL Alchemy AttributeError: 'unicode' object has no attribute '_sa_instance_state'SQL Alchemy AttributeError:“unicode”对象没有属性“_sa_instance_state”
【发布时间】:2018-12-01 17:20:08
【问题描述】:

所以我一直在创建一个用户数据库,这些用户可以收藏在线购物网站中的商品。即使当我输入 b.title 和 board 时,我似乎也遇到了这个错误,它们都打印“u'board name'”。 应该这样,当有人选中一个棋盘复选框时,应该将那件衣服与棋盘的关系添加到数据库中。

<form action="" method="POST" name="boards_list">
          <table class="table is-striped">
            {% for board in boards %}
            <tr>
              <td>
                <label class="checkbox">
                  <input type="checkbox" name="board_titles" value="{{board.title}}"/>
                </label>
                <a href="#">{{board.title}}</a>
              </td>
            </tr>
            {% endfor %}
          </table>

          <div class="field is-grouped">
            <div class="control">
              <button type="submit" class="button is-small">Add To Favs</button>
            </div>
          </div>
        </form>

这是来自上面所示 Jinja2 模板的代码。以下是根源代码:

if request.method =="POST":
            f_b_titles = request.form.getlist("board_titles")
            clothing = Clothing.query.filter_by(name = name).first()
            userid = int(current_user.id)
            clothingid = int(clothing.id)
            for b in boards:
                for board in f_b_titles:
                    if b.title == board:
                        fav_relationship = Favourites_relationship(user_id = userid, clothing_id = clothingid, favs_board = b.title)
                        db.session.add(fav_relationship)
                        db.session.commit()
                        flash('Added favourite to mood board!', 'success')

最后,来自 db 模型的代码:

class Favourites_relationship(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), unique=True, nullable=False)
clothing_id = db.Column(db.Integer, db.ForeignKey('clothing.id'),nullable=False)
board_title = db.Column(db.Unicode, db.ForeignKey('favourites_board.title'), nullable=False)

和:

class Favourites_board(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
favourites_relationships = db.relationship('Favourites_relationship', backref='favs_board', lazy=True)

有关错误的更多信息:

return self.wsgi_app(environ, start_response)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/leawhitelaw/Desktop/online_shop_data/flaskshop/routes.py", line 97, in product_details
fav_relationship = Favourites_relationship(user_id = userid, clothing_id = clothingid, favs_board = b.title)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    试试

    fav_relationship = Favourites_relationship(user_id = userid, clothing_id = clothingid, favs_board = b)
    

    基本上错误的意思是您只能将Favourites_board 实例(例如fb = Favourites_board())分配给关系。

    因此,假设 board 是 Favourites_board 实例的列表,您只需将该列表中的一个 board (b) 分配给 favs_board=...

    【讨论】:

    • 这似乎已经修复了,我还没有测试它是否正确进入数据库,但现在出现了成功横幅。谢谢!!!
    【解决方案2】:
    board_title = db.Column(db.Unicode, db.ForeignKey('favourites_board.title'), nullable=False)
    

    这一行是错误的

    来自here

    使用Unicode类型时,只适合通过Python unicode 对象,而不是普通的 str。如果一个普通的 str 通过 Python 2,发出警告。如果您注意到您的申请 发出这些警告,但您不确定它们的来源, Python 警告过滤器,记录在 http://docs.python.org/library/warnings.html,可以用来转 这些警告变成了异常,这将说明堆栈跟踪:

    因为您是从表单传递原始值并且需要 python 对象。

    尝试使用:

    db.字符串

    db.Text

    或 db.Unicodetext

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多