2015-02-05 5 views
-2

Существует код:Как рассчитать сумму для многих объектов

ids = [] 
menu = {} 
for offer in customer_order.split(';'): 
    id, count = offer.split(':') 
    ids.append(id) 
    menu[int(id)] = int(count) 
mList = Goods.objects.filter(id__in=ids, 
          kind_cost=1).values('id', 'cost') 
for item in mList: 
    id = item['id'] 
    cost = item['cost'] 
    menu[id] = menu[id] * cost 
return sum(menu.values()) 

customer_order является строка, которая включает в себя: '32: 5; 45: 2; 555: 23' и т.д.

Мой вопрос : Я уверен, что есть лучшее решение для достижения результата. Может ли кто-нибудь помочь мне найти решение? Пожалуйста, поделитесь ссылками, чтобы узнать, как улучшить код.

Tnx!

UPD: Мне нужно суммировать стоимость всех товаров

+2

'customer_order' - это диктофон? 'dict' не имеет метода' split' ... Что вы пытаетесь сделать - вы описываете его словами, а не кодом? –

+0

Что должно делать 'Goods.objects.'? – Marcin

+1

@ Marcin 'Goods' - модель django. 'objects.filter' - запрос базы данных, который возвращает все объекты в этой модели после фильтра (в этом случае« id в идентификаторах AND kind_cost == 1 ») –

ответ

0

выглядит как customer_order является строка, которая выглядит как Dict (возможно, JSON?) Если это JSON вы должны использовать json модуль для разбора, но я идти вперед и работать в предположении, что он на самом деле является родным объектом словаря python в виде строки.

import ast 

customer_order = ast.literal_eval(customer_order) 
# makes this into an ACTUAL dict... 

mList = Goods.objects.filter(id__in=customer_order.keys(), 
           kind_cost=1).values('id', 'cost') 
# mList is now a list of dicts, each dict has keys `id` and `cost` 

mList = dict([k.values() for k in mList]) 
# mList is now a single dict with id:cost pairings 

# As a lengthy aside, you might be better off just doing: 
# 
# # mList = Goods.objects.filter(id__in=customer_order.keys(),kind_cost=1) 
# # mList = {item.id:item.cost for item in mList} 
# 
# I find that must easier to read. If your items have a huge number of 
# columns, of course, this will vastly increase your query time. YMMV. 

result = [qty * mList[id] for id,qty in customer_order.items()] 

Если customer_order на самом деле только ключ-значение спариваний, которые выглядят как key1:value1;key2:value2, то вам придется сделать некоторые предварительной обработки.

customer_order = {keyvalue.split(":") for keyvalue in customer_order.split(";")} 
+0

' customer_order' не JSON. Он больше похож на CommaSeparatedField, но использует точку с запятой. –

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