【问题标题】:'unicode' object has no attribute '_sa_instance_state' [duplicate]“unicode”对象没有属性“_sa_instance_state”[重复]
【发布时间】:2016-03-26 21:56:06
【问题描述】:

我正在尝试创建一个页面,客户可以在其中选择给定菜单项的副项目和数量,并将其添加到他们的订单中。我在尝试将其提交到我的数据库时遇到了麻烦...无论我尝试什么,都会抛出 AttributeError 说任何对象没有属性“_sa”...

这是我的模型:

class MenuItems(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), index=True, unique=True)
    category = db.Column(db.String(50))
    price = db.Column(db.Float(6))
    description = db.Column(db.String(140))
    image_path = db.Column(db.String(140), unique=True)
    def __unicode__(self):
        return self.name

class Orders(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    customer_id = db.Column(db.Integer, db.ForeignKey('customer.id'))
    created_on = db.Column(db.DateTime)
    submitted = db.Column(db.Boolean)
    submitted_on = db.Column(db.DateTime)
    order_items = db.relationship('OrderItems', backref='orders', lazy='dynamic')

    def __unicode__(self):
        return str(self.customer_id)

class OrderItems(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    order_id = db.Column(db.Integer, db.ForeignKey('orders.id'))
    menu_item_id = db.Column(db.Integer, db.ForeignKey('menu_items.id'))
    side_id = db.Column(db.Integer, db.ForeignKey('menu_items.id'))
    quantity = db.Column(db.Integer)

    menu_item = db.relationship(MenuItems, foreign_keys=[menu_item_id], 
                            backref="menu_item")
    side_item = db.relationship(MenuItems, foreign_keys=[side_id], 
                            backref="side_item")
    def __unicode__(self):
        return str(self.id)

还有形式:

class OrderForm(Form):
    side = SelectField(u'MenuItem', validators=[DataRequired()])
    quantity = IntegerField(default=1)
    submit = SubmitField("Add to Order")

    def __init__(self, *args, **kwargs):
        Form.__init__(self, *args, **kwargs)

    def validate(self):
        if not Form.validate(self):
            return False

相关观点:

@login_required
@davesbread.route('/detail/<menu_item_name>', methods=['GET', 'POST'])
def detail(menu_item_name):
    form = OrderForm()
    form.side.choices=[(s.id, s.name) for s in 
                    MenuItems.query.filter_by(category='side').all()]
    menu_item =   MenuItems.query.filter_by(name=menu_item_name).first_or_404()
    if form.validate_on_submit():
        add_to_order(menu_item.id)
    return render_template('customer/detail.html', title="Dave's Bread - " + menu_item.name,
                            menu_item=menu_item, form=form, user=current_user)

@login_required
@davesbread.route('/add_to_order/<menu_item_id>', methods=['GET', 'POST'])
def add_to_order(menu_item_id):
    id = menu_item_id
    form = OrderForm()
    side = form.side.data
    quantity = form.quantity.data
    if current_user.is_anonymous:
        return redirect(url_for('login'))
    menu_item = MenuItems.query.filter_by(id=id).first()
    order_exists = order_loader()
    if order_exists:
        order = Orders.query.filter_by(customer_id=current_user.id).first()
        order_item = OrderItems(menu_item=menu_item, quantity=quantity,
                                side_item=side)
        order.order_items.append(order_item)
        db.session.add(order)
        db.session.commit()
    else:
        order_item = OrderItems(menu_item=menu_item, quantity=quantity,
                                side_item=side)
        order = Orders(customer_id=current_user.id, 
                       created_on=datetime.datetime.now(),
                       submitted=False)
        order.order_items.append(order_item)
        db.session.add(order)
        db.session.commit()
        session['cart'] = True
        flash('Item added to order')
    return redirect(url_for('menu', category=menu_item.category))

模板:

{% extends "base.html" %}

{% block content %}

<table>
  <tr>
    <td>
      <img src="{{ menu_item.image_path }}">
    </td>
    <td>
      <h3>{{ menu_item.name }}</h3>
      <br>
      <p> {{ menu_item.description }}</p>
    </td>
    <td>
       <form action="{{ url_for('add_to_order', menu_item_id=menu_item.id) }}" 
             method=post>
        {{ form.hidden_tag() }}

        {{ form.side }}

        {{ form.quantity.label }}
        {{ form.quantity }}

        {{ form.submit }}
       </form>
    </td>
  </tr>
<table>

{% endblock %}

这是回溯: https://gist.github.com/baccb79b31728e63f252

是什么导致了这个错误?在此先感谢:)

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

    我相信这个问题就像here 描述的那样:您将字符串作为构造函数的参数传递到预期对象的位置(即对应的字段是关系而不是字符串列)。

    例如,这些行可能会给您该错误:

    side = form.side.data
    # here side is a string
    
    # ...
    
        order_item = OrderItems(menu_item=menu_item, quantity=quantity,
                                side_item=side)
    
    # here side_item is expected to be an object 
    # as it is defined as a relationship in the model
    

    您必须将side_item=side 中的side 替换为由side 值查询的适当MenuItems 实例。

    【讨论】:

    • 完美运行。用查询的项目替换边是我缺少的感谢负载
    • 请接受一个可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2023-03-17
    • 1970-01-01
    • 2016-01-10
    • 2018-12-23
    • 2021-12-27
    相关资源
    最近更新 更多