Ошибка типа Django «не поддается подписке»

#django #django-queryset #typeerror

#django #django-набор запросов #ошибка типа

Вопрос:

Я пытаюсь создать список, который состоит из нескольких вычислений. далее, идея состоит в том, чтобы отобразить ее в шаблоне.

Это то, что у меня есть до сих пор:

views.py :

 def calculation(request, itemslug):

#All the Values ordered chronologically:  

values = Value.objects.filter(item__slug=itemslug).order_by('date')

dates = []
results =[]

#Create a list consisting of the dates

for value in values:
    a = value.date
    dates.append(a)

#Peform a calculation per date

for date in dates:

    latestvalue = Value.objects.filter(item__slug=itemslug).get(date=date)['amount']
    paidup = CashFlow.objects.filter(item__slug=itemslug).filter(date__lt=date).filter(type='cashin').aggregate(sum=Sum('amount'))['sum']

    try:
       result = round(latestvalue/paidup * 100,2)
    except ZeroDivisionError :
       result = 0

    results.append(result)

return render(request, 'overview/detail.html',
    {
    'result':results,
    })
  

к сожалению, я получаю TypeError: ‘Объект Value не поддается подписке’
возможно, в моем коде есть некоторые другие ошибки.. Большое спасибо за просмотр!!

Спасибо,

Комментарии:

1. Я бы попробовал удалить [sum] поиск для paidup . Может сработать что-то вроде этого CashFlow.objects.filter(....).aggregate(sum=Sum('amount')).sum

2. это набор запросов, а не dict

3. ['sum'] все в порядке ( aggregate() возвращает словарь). Но ['amount'] в строке выше этого нет, get() возвращает объект ( Value здесь). Итак: .amount

4. действительно, да!! Большое спасибо

Ответ №1:

Как насчет того, чтобы немного упростить ее:

     latestvalue = Value.objects.get(item__slug=itemslug, date=date).amount
    paidup = (CashFlow.objects
        .filter(item__slug=itemslug, date__lt=date, type='cashin')
        .aggregate(sum=Sum('amount'))['sum'])