gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:37 24 4
gpt4 key购买 nike

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

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)

关于python - 创建新对象返回 AttributeError : 'list' object has no attribute '_sa_instance_state' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com