我正在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'
,然后第二次提交:
错误请求浏览器(或代理)发送了此服务器无法理解的请求
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')
为什么会出错,为什么仅在提交第二种表单时才会抛出该错误?
答案 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