You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django报错list index out of range:无Ticket对象时触发URL异常

问题解决:Django中删除Ticket对象后触发IndexError的修复

问题原因

你当前的代码里,Ticket.objects.filter(customer=customer).order_by("-id")[0]在没有匹配的Ticket对象时,会抛出IndexError(列表索引越界),但你捕获的是Ticket.DoesNotExist异常——这个异常只有get()方法才会触发,filter()切片不会抛出它,所以异常处理完全没生效,导致错误暴露。

解决方案

推荐两种简洁可靠的修复方式:

方法1:使用first()方法(最推荐)

Django的QuerySet提供了first()方法,会返回查询集的第一个对象,没有结果时返回None,不会抛出异常。修改后的代码如下:

from datetime import datetime, timedelta

# 初始化check_time为默认值,避免未定义的情况
check_time = False
ticket = Ticket.objects.filter(customer=customer).order_by("-id").first()

if ticket is not None:
    now = datetime.now().date()
    set_date = ticket.date_posted
    check_time = now - set_date <= timedelta(hours=24)
    print('working' if check_time else 'not working')

context = {"check_time": check_time}

方法2:捕获IndexError异常

如果你坚持用切片[0],需要把捕获的异常改成IndexError,同时处理check_time未定义的问题:

from datetime import datetime, timedelta

check_time = False
try:
    ticket = Ticket.objects.filter(customer=customer).order_by("-id")[0]
    now = datetime.now().date()
    set_date = ticket.date_posted
    check_time = now - set_date <= timedelta(hours=24)
    print('working' if check_time else 'not working')
except IndexError:
    ticket = None

context = {"check_time": check_time}

关键改动说明

  • 提前初始化check_time:避免当没有Ticket对象时,check_time未定义导致上下文传递出错。
  • 替换切片为first()/修正异常类型:确保无数据时不会抛出未捕获的异常。
  • 逻辑清晰:只有当ticket存在时才执行时间检查逻辑,符合你“无则不执行相关操作”的需求。

内容的提问来源于stack exchange,提问作者betty_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:15:32