2016-03-03 170 views
1

嗨我想做一个简单的应用程序,用户有能力创建新的鸡尾酒。因此,我有两个模型与多种关系创建一个新的对象返回AttributeError:'列表'对象没有属性'_sa_instance_state'

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,我尝试创建鸡尾酒对象,然后将它保存在数据库:

@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' object has no attribute '_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') 

谢谢

回答

2

我认为你的错误实际上并不是从c = Cocktail()行开始的。

的问题,而不是在于行

c.ingredients.append(cocktail_ingredients) 

cocktail_ingredients是一个列表。您将追加列表添加到c.ingredients,而您应该只将Ingredient的实例附加到该列表。您想用.extend代替:

c.ingredients.extend(cocktail_ingredients) 
+0

谢谢@univerio我看不到它!我会upvote你的答案,但我不能:/ –

+0

@ERodriguez请接受答案,如果它解决了你的问题。谢谢! – univerio

+0

答案已接受! :) –

相关问题