· 4 years ago · Jul 11, 2021, 04:16 AM
1def get_top5(request):
2 """В данном классе собираем словарь со списком из 5 клиентов, потративших наибольшую сумму за весь период
3 co следующей структурой: { Response: [{username: customer, spent_money: total, gems: list_gems}, ...], где
4 list_gems - список из названий камней, которые купили как минимум двое из списка "5 клиентов,
5 потративших наибольшую сумму за весь период", и данный клиент является одним из этих покупателей."""
6 # получаем queryset с ТОП 5 покупателей по сумме за все время и выбираем из него:
7 # 1) список с именами покупателей - list_customers
8 # 2) список словарей для ответа по запросу к API - top5_customers
9 top5_queryset = Deals.objects.values('customer').annotate(total=Sum('total')).order_by('-total')[:5]
10 top5_customers = {'Response': []}
11 list_customers = []
12 for object in top5_queryset:
13 top5_customers['Response'].append({'username': object['customer']})
14 top5_customers['Response'][-1].update({'spent_money': object['total']})
15 list_customers.append(object['customer'])
16
17 # выбираем из queryset-объекта списки купленных камней по каждому из ТОП 5 покупателей и фомируем словарь
18 # где ключ - customer, значение - список всех купленных им камней.
19 all_gems_queryset = Deals.objects.extra(where=[f'customer IN{tuple(list_customers)}']).distinct(
20 'customer', 'item')
21 dict_gems = {}
22 for object in all_gems_queryset:
23 dict_gems.update({getattr(object, 'customer'): []})
24 for object in all_gems_queryset:
25 if getattr(object, 'customer') in dict_gems:
26 dict_gems[getattr(object, 'customer')].append(getattr(object, 'item'))
27
28 # выбираем из dict_gems названия камней, которые купили как минимум двое из списка "5 клиентов,
29 # потративших наибольшую сумму за весь период.
30 popular_gems = {}
31 for key, value in dict_gems.items():
32 for gem in value:
33 if gem not in popular_gems:
34 popular_gems.update({gem: 1})
35 else:
36 popular_gems[gem] += 1
37
38 for item in top5_customers['Response']:
39 item['gems'] = []
40 for gem in dict_gems[item['username']]:
41 if popular_gems[gem] > 1:
42 item['gems'].append(gem)
43 # Возвращаем полученный словарь в формате json
44 return HttpResponse(json.dumps(top5_customers, ensure_ascii=False).encode('utf8'))