您好我正在尝试做一个简单的应用程序,用户可以创建新的鸡尾酒。因此,我有两个模型,有很多关系
from . import db
assoc_table = db.Table('association',
db.Column('ingredient_id', db.Integer, db.ForeignKey('ingredients.id')),
db.Column('cocktail_id', db.Integer, db.ForeignKey('cocktails.id'))
)
class Ingredient(db.Model):
__tablename__ = 'ingredients'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
cost_price = db.Column(db.Float, default=0.0)
cocktails = db.relationship('Cocktail',
secondary=assoc_table,
backref=db.backref('ingredients'),
lazy='dynamic')
class Cocktail(db.Model):
__tablename__ = 'cocktails'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
serv_percentage = 0.25
sell_price = db.Column(db.Float)
在视图中,如果是GET请求,我会发送表单。如果是POST,我尝试创建Cocktail对象,然后将其保存在数据库中:
@main.route('/new', methods=['GET', 'POST'])
def new():
form = CocktailForm()
form.ingredients.choices = [(i.id, i.name) for i in Ingredient.query.all()]
if form.validate_on_submit():
cocktail_name = form.name.data
cocktail_ingredients = Ingredient.query.filter(Ingredient.id.in_(form.ingredients.data)).all()
c = Cocktail()
c.name = form.name.data
c.ingredients.append(cocktail_ingredients)
db.session.add(c)
db.session.commit()
return redirect(url_for('.index'))
return render_template('new.html', form=form)
我得到了AttributeError:
'list'对象没有属性'_sa_instance_state'
在尝试创建空Cocktail:
c = Cocktail()
我不知道问题是什么。
我检查了很多答案,通常与人际关系有关,所以我真的不知道我的代码有什么问题
这是表单类,虽然我认为这不是问题所在:
class CocktailForm(Form):
name = StringField('What is the coktail\'s name?', validators=[Required()])
ingredients = SelectMultipleField('Ingredients', coerce=int)
submit = SubmitField('Submit')
谢谢
答案 0 :(得分:4)
我认为您的错误实际上并非来自c = Cocktail()
行。
问题在于
c.ingredients.append(cocktail_ingredients)
cocktail_ingredients
是一个列表。当您只应向其添加c.ingredients
个实例时,您会将列表附加到Ingredient
。您想要使用.extend
代替:
c.ingredients.extend(cocktail_ingredients)