SQLAlchemy:'InstrumentedList'对象没有属性/错误请求浏览器(或代理)发送了该服务器无法理解的请求

时间:2018-08-22 02:55:31

标签: python flask-sqlalchemy

我正在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)

以此类推。

首先打印menuuser

<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'>]>]>

但是第二menuuser向我抛出错误:

  

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

,然后第二次提交:

  

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

models.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')

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

2 个答案:

答案 0 :(得分:0)

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

AttributeError: 'InstrumentedList' object has no attribute

还有许多其他类似问题的stackoverflow问题。请仔细检查它们。

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

答案 1 :(得分:0)

荒唐。简单地:

strcpy_s