【问题标题】:Python list: list index out of rangePython列表:列表索引超出范围
【发布时间】:2018-03-07 14:45:24
【问题描述】:

我对 python 不太熟悉,从我的一个朋友那里得到了这段代码,需要一些社区帮助来解决这个问题。我从以下行收到“列表索引超出范围”错误。

days = list(zip(Leave_type.objects.filter(type=leavetype).values_list('max_days', flat=True))[0])

注意:我已经执行了迁移并设置了我的数据库。

def timeoffapply(request):

if not request.session.get('id', None):
    return render(request, 'login.html')
else:
    stdate = request.POST['startDate']
    enddate = request.POST['endDate']
    leavetype = request.POST['leaveType']
    days = list(zip(Leave_type.objects.filter(type=leavetype).values_list('max_days', flat=True))[0])
    d1 = datetime.strptime(stdate, "%Y-%m-%d")
    d2 = datetime.strptime(enddate, "%Y-%m-%d")
    d3 = abs((d2 - d1).days)+1
    empid = (request.session['id'])[0]
    countdays = Leave.objects.filter(Emp_id = empid,type=leavetype).aggregate(Sum('days'))
    if countdays['days__sum'] == None:
        finaday = (days[0] - 0)
    else:
        finaday=(days[0] - countdays['days__sum'])
    if enddate>=stdate:
        if finaday >= d3:
            getleaveid = list(zip(Leave_type.objects.filter(type=leavetype).values_list('id', flat=True))[0])
            split_lt_id = ("".join(str(e) for e in getleaveid))
            empid = (request.session['id'])[0]
            get_emp_name = list(zip(Employee.objects.filter(id=empid).values_list('name', flat=True))[0])
            get_emp_name = ("".join(str(e) for e in get_emp_name))
            empid = (request.session['id'])[0]
            leave_id = Leave.objects.all().count()
            test = Leave(id=(leave_id + 1), name=get_emp_name, type=leavetype, start_date=stdate, end_date=enddate,
                         days=d3,
                         status="pending")

            test.Emp_id_id = empid
            test.leave_type_id_id = split_lt_id
            test.save()
            return HttpResponseRedirect('/')
        else:
            qs = Leave.objects.all().filter(Emp_id=(request.session['id'])[0])
            context = {
                "qs": qs,
                "error": "true",
                "msg": "You are allowed to have holidays for " + str(finaday) + " days in " +str(leavetype)
            }
            return render(request, 'timeoff.html', context)

【问题讨论】:

  • 打印作业右侧部分的组件,在作业之前,您应该找到错误原因。
  • 更熟悉 Python 吗?可以通过多种方式改进此代码 (finaday = (days[0] - 0)...),这将使您更容易理解错误。导致错误的那行也很奇怪(zip 是不必要的,切片就可以了,但即使这样也是不必要的,因为days 的唯一用途是days[0],所以你可以得到first结果)。无论如何,错误信息不会说谎;该列表必须为空,您可以按照 progmatico 的建议进行打印,以找出与您的预期不同的原因。

标签: python django python-2.7 django-models


【解决方案1】:

可能存在从Leave_type.objects.filter(type=leavetype).values_list('max_days', flat=True) 返回的列表为空的情况,而您正在使用[0] 访问空列表中的第一个元素。所以造成list index out of range错误。

【讨论】:

  • 我填写了关于离开类型的数据库表并尝试再次调试我的程序,但我仍然遇到同样的错误
【解决方案2】:

问题只是从 Leave_type 模型返回的查询集是空的;因此您无法访问它。

【讨论】:

  • 我填写了关于离开类型的数据库表并尝试再次调试我的程序,但我仍然遇到同样的错误
  • 如果您将check = Leave_type.objects.filter(type=leavetype) 添加到相关行上方的代码中,check 是否是一个空查询集?或者是否有数据?您可能在数据库中有数据,但您的查询没有返回它。
猜你喜欢
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多