Skip to main content
 首页 » 编程设计

python之创建新对象返回 AttributeError : 'list' object has no attribute '_sa_instance_state'

2025年05月04日29sharpest

您好,我正在尝试做一个简单的应用程序,用户可以在其中制作新的鸡尾酒。因此我有两个具有多对多关系的模型

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) 

在 View 中,如果是 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) 

我得到属性错误:

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

谢谢

请您参考如下方法:

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

问题反而出在行上

c.ingredients.append(cocktail_ingredients) 

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

c.ingredients.extend(cocktail_ingredients)