【问题标题】:How to avoid list index out of range in Django ORM query如何避免 Django ORM 查询中的列表索引超出范围
【发布时间】:2022-01-05 19:50:52
【问题描述】:

我这里有一个棘手的场景,通常我从下面的查询中得到 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])

由于缺少值,当前列表索引超出了上述范围

【问题讨论】:

  • 如果您的问题与您的代码中描述的一样,请使用sum 而不是手动索引它
  • 如果求和所有的值将被捕获,我需要省略第 2 个月和第 3 个月的起始值
  • 啊,我应该更清楚地阅读您的问题。数据是静态的还是动态的,您的要求是:1.从第一个月的起始价格开始,2.跳过所有其他月份的起始价格 3.只添加每个月的结束价格?
  • @AsgerWeirsøe 第一个月的起始日期价格和结束日期价格,剩余月份的唯一最后日期价格

标签: python python-3.x django django-models django-rest-framework


【解决方案1】:

所以距离我上次使用 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

这应该可以解决您正在尝试做的事情

【讨论】:

    【解决方案2】:

    您需要先访问该行,然后再访问该列:

    total_sum = 0
    for i in [0, 1, 3, 5]:    
        total_sum += monthly_values[i][1]
    

    这使您可以“手动”访问。 @Asger 的答案是自动的。

    【讨论】:

    • 得到以下错误 AttributeError: 'QuerySet' object has no attribute 'iat'
    猜你喜欢
    • 2023-04-07
    • 2018-06-18
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2023-03-09
    相关资源
    最近更新 更多