ошибка sqlalchemy.orm.exc.UnmappedInstanceError: Приложение класса.формы.Проверка» не отображается

#flask #flask-sqlalchemy #flask-wtforms

Вопрос:

я пытаюсь добавить экземпляр объекта через форму к другому объекту. я продолжаю получать эту ошибку.

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'app.forms.Checkout' is not mapped

я смог добиться того, чего хотел, с помощью оболочки python здесь, но этот же подход не сработал из моего routes.py файла

Вот мой routes.py

 @app.route('/checkout', methods=['GET', 'POST']) def checkout():  order = Customerorder.query.first()  form = Checkout(request.form)  if request.method == "POST":  first_name = form.first_name.data  last_name = form.last_name.data  address = form.address.data  contact = form.contact.data  payment = form.payment.data  #customerorder = request.form.get('customerorder')  print(customerorder)  new_checkout = Checkout(first_name=first_name, last_name=last_name,  address=address, contact=contact, payment=payment, customerorder=order)  db.session.add(new_checkout)  db.session.commit()  session.pop('Shoppingcart')  flash(f'You order has been sent. Your order will be delivered soon.')  return redirect(url_for('cart'))   return render_template('checkout.html', form=form, order=order)  

вот мой checkout.html

 {% extends "base.html" %}  {% block content %} lt;div class="container"gt;  lt;div class="row"gt;  lt;div class="col-md-8 order-md-1"gt;  lt;h4 class="mb-3"gt;Customer informationlt;/h4gt;  {{ form.csrf_token }}  {% from "_formhelpers.html" import render_field %}  lt;form action="" method="POST"gt;  {{ render_field(form.first_name, class="form-control", placeholder="first name", label="name") }}  {{ render_field(form.last_name, class="form-control", placeholder="last name") }}  {{ render_field(form.address, class="form-control", placeholder="address") }}  {{ render_field(form.contact, class="form-control", placeholder="Customer contact") }}  {{ render_field(form.payment, class="form-control") }}  lt;hrgt;  lt;select name="customerorder" id="customerorder" class="form-control m-2" requiredgt;   lt;option value="{{order.id}}"gt;{{order.invoice}}lt;/optiongt;   lt;/selectgt;  lt;brgt;  lt;button type="submit" class="btn btn-outline-info f-text"gt;Send orderlt;/buttongt;  lt;/formgt;  lt;/divgt;  lt;/divgt;  {% include "_messages.html"%} lt;/divgt; {% endblock %}  

вот мой models.py

 class Customerorder(db.Model):  id = db.Column(db.Integer, primary_key=True)  invoice = db.Column(db.String(20), unique=True, nullable=False)  status = db.Column(db.String(20), default='Pending', nullable=False)  date_created = db.Column(  db.DateTime, default=datetime.utcnow, nullable=False)  orders = db.Column(JsonEcodedDict)   def __repr__(self):  return f"{self.invoice} | {self.date_created}"  class Checkout(db.Model):  id = db.Column(db.Integer, primary_key=True)  first_name = db.Column(db.String(64), index=True, unique=False)  last_name = db.Column(db.String(64), index=True, unique=False)  address = db.Column(db.String(64), index=True, unique=False)  contact = db.Column(db.Integer(), index=True, unique=False)  payment = db.Column(db.String(20), index=True, unique=False)  customerorder_id = db.Column(db.Integer, db.ForeignKey('customerorder.id'))  customerorder = db.relationship("Customerorder", backref=db.backref("customerorder", uselist=False))   

вот мой forms.py

 class Checkout(Form):  first_name = StringField('First Name', [validators.DataRequired()])  last_name = StringField('Last Name', [validators.DataRequired()])  address = StringField('Address', [validators.DataRequired()])  contact = StringField('contact', [validators.DataRequired()])  payment = SelectField(choices=[('card', 'Online'), ('cash', 'Cash')])  

Кто-нибудь может помочь мне понять, что я сделал не так?

Комментарии:

1. Checkout Класс в вашем маршруте-это форма, но вы пытаетесь использовать его как форму и как модель. Убедитесь, что вы импортируете оба класса с разными именами или, что еще лучше, с их пространством models.Checkout имен, forms.Checkout .

2. Блин. Это было глупое соглашение об именах с моей стороны. Спасибо, что указали на это.