#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'])