2015-09-15 2 views
3

Я пытаюсь создать корзину покупок на основе сеансов на Flask.Как добавить существующие ключи по значению в словаре python?

Идея проста:

  1. Клиент нажимает кнопку "Добавить в корзину" кнопки со скрытыми входами product_id и qty
  2. Этот POST запрос добавляет новую запись в сессии [ "корзина"] словарь

    [{'qty': '1', 'product_id': '6'}, 
    {'qty': '1', 'product_id': '6'}, 
    {'qty': '1', 'product_id': '6'}] 
    
  3. Я поймаю эти поля и добавлю их в сессию dict:

    session["cart"].append(dict({'product_id': id, 'qty': qty})) 
    

Каждый раз, когда кто-то добавляет товар в корзину, он добавляет новую запись {'product_id': id, 'qty': qty} в корзину.

Как проверить, есть ли этот product_id уже в словаре, и если да, добавьте только qty, но не создайте новую запись в словаре с такими же product_id?

Мой Добавить в корзину:

@app.route('/add-to-cart', methods=['GET', 'POST']) 
def add_to_cart(): 
    if request.method == 'POST': 
     id = int(request.form['product_id']) 
     qty = int(request.form['qty']) 

     cart_session() 

     matching = [d for d in session['cart'] if d['product_id'] == id] 
     if matching: 
      matching[0]['qty'] += qty 

     session["cart"].append(dict({'product_id': id, 'qty': qty})) 

     return redirect(url_for('home')) 

Solution

@app.route('/add-to-cart', methods=['GET', 'POST']) 
def add_to_cart(): 
    if request.method == 'POST': 
     id = int(request.form['product_id']) 
     qty = int(request.form['qty']) 

     cart_session() 

     matching = [d for d in session['cart'] if d['product_id'] == id] 
     if matching: 
      matching[0]['qty'] += qty 
     else: 
      session["cart"].append(dict({'product_id': id, 'qty': qty})) 

     return redirect(url_for('home')) 
+4

Не было бы проще иметь словарь с 'product_id' в качестве ключей и' qty' в качестве значений? Тогда вы можете использовать 'defaultdict (int)' в качестве своего словаря. – rlbond

ответ

3

Один простой способ в Python, чтобы искать объекты в списке, чтобы использовать список понимание:

matching = [d for d in session['cart'] if d['product_id'] == id] 
if matching: 
    matching[0]['qty'] += int(qty) 
else: 
    session['cart'].append(dict({'product_id': id, 'qty': int(qty)})) 
+0

спасибо, вам нужно проверить – DeN

+0

Это решение работает, но оно создает [{'product_id': '6', 'qty': '11111'}, {'product_id': '6', 'qty': '1'} , {'product_id': '6', 'qty': '1'}, {'product_id': '6', 'qty': '1'}, {'product_id': '6', 'qty': '1'}] для 0 элемента в массиве он добавляет qty сзади, но также добавляет тот же продукт – DeN

+0

Мой код не должен был быть полным решением для использования как есть, просто подсказка о том, как идти ... Для первого элемента , это потому, что вы храните количество в виде строки, вы должны использовать int ('matching [0] ['qty'] + = int (qty)'). И для других элементов это, вероятно, потому, что у вас все еще есть старый код, который всегда выполняется. – Djizeus

3

Нравится rlbondhas already suggested использовать defaultdict, что-то вроде этого:

cart = defaultdict(int) 
for product_id, qty in d.iteritems(): 
    cart[product_id] += qty 

Таким образом, в этом случае, если запись с некоторым ключом product_id еще не существует в cart Словаре, он будет инициализирован к 0 автоматически увеличивается.

+0

Возможно, посмотрите более простой способ решить этот вопрос и попытаться манипулировать сеансом ["cart"] и post_id в нем – DeN

Смежные вопросы