首页 > 解决方案 > SQLAlchemy:“InstrumentedList”对象没有属性/错误请求浏览器(或代理)发送了此服务器无法理解的请求

问题描述

SQLALchemy在应用程序中使用多个表单将项目添加到菜单中Flask,如下所示:

# query by user
user = User.query.filter_by(restaurant=session['user']).first()
# if user does not have a menu, create one
if user.menu == []:
    menu = Menu()
    db.session.add(menu)
    db.session.commit()
else:
    user = User.query.filter_by(restaurant=session['user']).first()
    menu = user.menu

    #item 1
try:
    add = request.form['dish']
    dish = Dish()
    db.session.add(dish)
    dish.name = add
    db.session.commit()
    # add dish to menu
    menu.dishes.append(dish)
    # add menu to user
    user.menu.append(menu)
    db.session.commit()
    print (menu, user)
except Exception as e:
        print str(e)

    #item 2
try:
    add2 = request.form['dish']
    dish = Dish()
    db.session.add(dish)
    dish.name = add2
    db.session.commit()
    # add dish to menu
    menu.dishes.append(dish)
    # add menu to user
    user.menu.append(menu)
    db.session.commit()
    print (menu, user)
except Exception as e:
        print str(e)

等等。

首先menu打印user

<Dishes [<ID 1>, <Name u'pasta'>]>
<ID 1>, <User u'Suplicy'>, <Username u'me'>, <Email u'me@mac.com'>, <Menu [<Dishes [<ID 1>, <Name u'pasta'>]>]>

但第二个menu并向user我抛出错误:

'InstrumentedList' 对象没有属性 'dishes'

并且,在第二次提交时:

错误请求 浏览器(或代理)发送了此服务器无法理解的请求

模型.py

class User(db.Model):
    __tablename__='user'

    id = db.Column(db.Integer, primary_key=True)
    restaurant = db.Column(db.String(50))
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    address = db.Column(db.String(30), unique=True)

    menu = db.relationship("Menu",
                    backref=db.backref('user'), 
                    uselist=True)

class Menu(db.Model):
    __tablename__='menu'

    id = db.Column(db.Integer, primary_key=True)  
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    dishes = db.relationship('Dish',
                            back_populates='menu',
                            uselist=True)

class Dish(db.Model):
    __tablename__='dish'

    menu_id = db.Column(db.Integer, db.ForeignKey('menu.id'))
    menu = db.relationship('Menu',
                    back_populates='dishes')

为什么会出现错误,为什么仅在提交第二个表单时才抛出?

标签: pythonflask-sqlalchemy

解决方案


以下链接要求您更改 uselist=False in backref

AttributeError:“InstrumentedList”对象没有属性

还有许多其他类似问题的stackoverflow问题。请通过它们。

编辑: 另外,我认为模型菜单和菜有多对多的关系。你能检查文档http://flask-sqlalchemy.pocoo.org/2.3/models/中的多对多关系模型格式吗


推荐阅读