Как организовать размещенные заказы - PullRequest
0 голосов
/ 25 марта 2019

Поэтому, когда я размещаю заказ, он создает новый заказ для каждого товара в корзине. Допустим, у меня в корзине 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 %}

Как это выглядит на странице:

order

Код для создания заказа:

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

Разница после изменений:

enter image description here

Я изменил код для отображения всех заказов:

@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, а с другой стороны отображает только один элемент, см. Ниже:

enter image description here

1 Ответ

1 голос
/ 30 марта 2019

Я протестировал этот код, он работает и группирует порядок по случайно сгенерированному order_id:

@phones.route("/order/", methods=['GET', 'POST'])
@login_required
def order():
    list_of_phones = session['cart']    
    random_string = random_generator()
    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)
            order_id = random_string
        db.session.add(order)
        db.session.commit()

    session.pop('cart')
    flash('Order was added successfully', 'success')
    return redirect(url_for('phones.shopping_cart'))

def random_generator():
    size = 16
    chars = string.ascii_letters + string.digits 
    return ''.join(random.choice(chars) for _ in range(size))

в маршруте вашего приложения:

@phones.route("/myorders", methods=['GET', 'POST'])
@login_required
def myorder():
    orders = db.session.query(Order).filter_by(
        user_id = current_user.id).all()

    return render_template('phones/myorder.html', 
        orders=orders) 

В вашем шаблоне вы можете использовать что-то вродеследующее:

{% for order_id, order in orders | groupby('order_id') %}
    {{ order_id }}
    {% for i in order %}
        <ul>
          {{ i.id }}
          {{ i.phone_name }}
        </ul>
    {% endfor %}
    <br>
{% endfor %}

с некоторыми тестовыми данными, которые я добавил в базу данных, я получаю следующее

abc

    1 phone1 
    2 phone2 
    3 phone3 


xyz

    4 phone4 
    5 phone5 
    6 phone6 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...