Объект 'itertools._grouper' не имеет атрибута 'пользователь' - PullRequest
0 голосов
/ 21 мая 2019

Почему я не могу преобразовать цикл group в groupby как list? В настоящее время я работаю над Django==2.2.1, и когда я пробую это data = [...] ниже в консоли Python, он работает нормально.

from itertools import groupby
from operator import itemgetter


@login_required
def list(request, template_name='cart/list.html'):
    # I also try with this dummy data
    test_data = [{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':5.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':5.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':7.0}]

    print(type(data)) # a list

    sorted_totals = sorted(test_data, key=itemgetter('total_order'))
    for agent_name, group in groupby(sorted_totals, key=lambda x: x['agent_name']):
        print(agent_name, list(group)) # I stopped here when converting the `group` as list.

Но я получаю сообщение об ошибке, похожее на это, когда пробую его в представлениях в Django.

error


Я тоже попробовал с defaultdict

from collections import defaultdict


@login_required
def list(request, template_name='cart/list.html'):

    test_data = [{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':5.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':5.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':7.0}]

    grouped = defaultdict(list)
    for data_total in test_data:
        grouped[data_total['agent_name']].append(data_total) # stoped here

    grouped_out = []
    for agent_name, group in grouped.items():
        total_order = 0
        total_pcs = 0
        total_kg = 0

        if isinstance(group, list):
            for data_total in group:
                total_order += data_total.get('total_order')
                total_pcs += data_total.get('total_pcs')
                total_kg += data_total.get('total_kg')

            grouped_out.append({
                'agent_name': agent_name,
                'total_order': total_order,
                'total_pcs': total_pcs,
                'total_kg': total_kg
            })

Но ошибка, обнаруженная мной, остановлена ​​просмотром оболочки. Если мы следуем за предыдущим выпуском, на него ссылаются с этим _wrapped_view

error wrapper

1 Ответ

0 голосов
/ 22 мая 2019

Наконец, я исправил это вручную, используя dict.

test_data = [{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':5.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':5.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agentbeli','total_pcs':1,'total_kg':6.0},{'total_order':1,'agent_name':'agent123','total_pcs':1,'total_kg':7.0}]


grouped = {}
for data_total in test_data:
    agent_name = data_total.get('agent_name')
    if agent_name in grouped:
        new_data = grouped[agent_name]  # dict
        new_data['total_order'] += data_total.get('total_order')
        new_data['total_pcs'] += data_total.get('total_pcs')
        new_data['total_kg'] += data_total.get('total_kg')

        grouped[agent_name].update(**new_data)
    else:
        grouped[agent_name] = data_total

И результат grouped выглядит следующим образом:

{'agent123': {'agent_name': 'agent123',
  'total_kg': 18.0,
  'total_order': 3,
  'total_pcs': 3},
 'agentbeli': {'agent_name': 'agentbeli',
  'total_kg': 17.0,
  'total_order': 3,
  'total_pcs': 3}}
...