Поэтому, когда я размещаю заказ, он создает новый заказ для каждого товара в корзине. Допустим, у меня в корзине 3 телефона, а затем в базу данных поступит 3 заказа. Как мне поступить, если я хочу сделать так, чтобы эти 3 телефона отображались как 1 заказ в «Моих заказах»?
Вот мои модели:
class Order(TimestampMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), unique=False )
phone_id = db.Column(db.Integer, db.ForeignKey('phone.id'),
unique=False, nullable=True)
accessory_id = db.Column(db.Integer, db.ForeignKey('accessory.id'),
unique=False, nullable=True)
Это код для отображения:
@phones.route("/myorders", methods=['GET', 'POST'])
@login_required
def myorder():
orders = Order.query.filter_by(user_id=current_user.get_id())
return render_template('phones/myorder.html', orders=orders)
и HTML:
{% extends "base.html" %}
{% block app_content %}
<div class="row">
<div class="container">
<div class="col-md-5">
<div class="content-section">
<table class="table table-striped">
{% for order in orders %}
<tr><th>{{order.id}} {{order.created_at}}</th>
<tr>
{% if order.phone %}
<td>{{order.phone.brand.name}} {{order.phone.model}} </td>
{% endif %}
{% if order.accessory %}
<td>{{order.accessory.brand}} {{order.accessory.compability.platform}} {{order.accessory.type.type_of_accessory}} </td>
{% endif %}
{% endfor %}
</table>
</div>
</div>
</div>
</div>
{% endblock %}
Как это выглядит на странице:
Код для создания заказа:
@phones.route("/order/", methods=['GET', 'POST'])
@login_required
def order():
list_of_phones = session['cart']
list_of_accessories = session['cart2']
for pid in list_of_phones:
phone = Phone.query.get(pid)
phone.stock = phone.stock - 1
order = Order(
user_id = current_user.get_id(),
phone_id = phone.id)
db.session.add(order)
db.session.commit()
for aid in list_of_accessories:
accessory = Accessory.query.get(aid)
accessory.stock = accessory.stock - 1
order = Order(
user_id = current_user.get_id(),
accessory_id = accessory.id)
db.session.add(order)
db.session.commit()
session.pop('cart')
session.pop('cart2')
flash('Order was added successfully', 'success')
return redirect(url_for('phones.shopping_cart'))
Разница после изменений:
Я изменил код для отображения всех заказов:
@phones.route("/myorders", methods=['GET', 'POST'])
@login_required
def myorder():
# orders = Order.query.filter_by(user_id=current_user.get_id())
orders = db.session.query(Order).filter_by(user_id = current_user.id).group_by(Order.order_id).all()
print(orders)
return render_template('phones/myorder.html', orders=orders)
И это отчасти работает, потому что отображает только один order_id, а с другой стороны отображает только один элемент, см. Ниже: