Как избежать выхода индекса списка за пределы диапазона в запросе Django ORM
У меня сложный сценарий, обычно я получаю 6 значений из нижеприведенного запроса, в основном цены на начало и конец месяца, значение цены будет там каждый раз
trade_date price
01-01-2021 120.2
31-01-2021 220.2
01-02-2021 516.2
28-02-2021 751.0
01-03-2021 450.2
31-03-2021 854.9
и мне нужна сумма начальной цены 1-го месяца + конечная цена 1-го месяца + конечная цена каждого месяца т.е. 120.2+220.2+751.0+854.9 но в некоторых случаях данные за последний месяц, как правило, отсутствуют, как справиться с этими сценариями
monthly_values = Items.objects.filter(trade_date__gte=quarter_start_date,
trade_date__lte=quarter_end_date).values_list('price',
flat=True).order_by('trade_date')
total_sum = monthly_values[0]+monthly_values[1]+monthly_values[3]+monthly_values[5])
В настоящее время индекс списка выходит за пределы диапазона из-за отсутствующих значений
Вам нужно получить доступ к строке, а затем к столбцу:
total_sum = 0
for i in [0, 1, 3, 5]:
total_sum += monthly_values[i][1]
Это дает вам доступ "вручную". Ответ @Asger 's автоматизирован.
Прошло некоторое время с тех пор, как я в последний раз использовал DjangoORM, но вы можете сделать что-то похожее на это
from datetime import date
monthly_values: list[tuple[date, float]] = Items.objects.filter(trade_date__gte=quarter_start_date,
trade_date__lte=quarter_end_date).values_list('trade_date', 'price').order_by('trade_date')
Затем создайте функцию, которая добавляет начальную цену из нашего ввода в результат, а затем добавляет все цены, где это не первый день месяца.
def get_prices(month_and_prices: list[tuple[date, float]]) -> float:
res = month_and_prices[0][1]
res += sum([x[1] for x in month_and_prices[1:] if x[0].day > 1])
return res
Это должно решить то, что вы пытаетесь сделать