创建一个新的Object返回AttributeError:'list'对象没有属性'_sa_instance_state'

时间:2016-03-03 02:31:24

标签: python flask flask-sqlalchemy

您好我正在尝试做一个简单的应用程序,用户可以创建新的鸡尾酒。因此,我有两个模型,有很多关系

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

谢谢

1 个答案:

答案 0 :(得分:4)

我认为您的错误实际上并非来自c = Cocktail()行。

问题在于

c.ingredients.append(cocktail_ingredients)

cocktail_ingredients是一个列表。当您只应向其添加c.ingredients个实例时,您会将列表附加到Ingredient。您想要使用.extend代替:

c.ingredients.extend(cocktail_ingredients)