Как избежать выхода индекса списка за пределы диапазона в запросе 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

Это должно решить то, что вы пытаетесь сделать

Вернуться на верх