django IndexError:列表赋值索引超出范围(在for循环中用count()对象填充数组)

l7mqbcuq  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(86)

我想用每个部门的医生数量填充数组'v',我得到了这个错误:

v[i]=Doctor.objects.all().filter(idDept__deptName__contains=s.deptName).count()
~^^^

IndexError:列表赋值索引超出范围

views.py

def accueilAdmin(request):
    if not request.user.is_staff:
        return redirect('loginAdmin')
    depts=Department.objects.all()
    v=[]
    i=1
    for s in depts:
        v[i]=Doctor.objects.all().filter(idDept__deptName__contains=s.deptName).count()
        i+=1

models.py

class Department(models.Model):
    deptName = models.CharField(max_length=50, null=False)
    ...
        return self.deptName

class Doctor(models.Model):
    name= models.CharField(max_length=50)
        ...
    idDept = models.ForeignKey(Department, on_delete=models.CASCADE, null=True)
    def __str__(self):
        return self.name

我不知道该怎么解决,希望你能帮忙,谢谢。

bn31dyow

bn31dyow1#

索引从0开始,您可以使用以下命令追加到列表中:

def accueilAdmin(request):
    if not request.user.is_staff:
        return redirect('loginAdmin')
    depts = Department.objects.all()
    v = []
    for s in depts:
        v.append(
            Doctor.objects.all()
            .filter(idDept__deptName__contains=s.deptName)
            .count()
        )
        i += 1

但这可能是不必要的,也是无效的,你可以用Doctor的数量来注解你的Department

from django.contrib.auth.decorators import user_passes_test
from django.db.models import Count
from django.urls import reverse_lazy

@user_passes_test(lambda u: u.is_staff, 'loginAdmin')
def accueil_admin(request):
    depts = Department.objects.annotate(num_doctors=Count('doctor'))
    # …

depts中的Department对象将有一个额外的属性.num_doctors,其中包含相关的Doctor的数量。这是在 same 查询中完成的,因此它极大地减少了查询量:

注意:函数一般用 snake_case 编写,而不是 PascalCase,因此建议将函数重命名为accueil_admin,而不是accueilAdmin

ebdffaop

ebdffaop2#

我是一个新手,但也许我的想法会帮助你:lists枚举以'0'开始,在www.example.com中views.py,您将value分配给'v'等于空list,因此那里没有元素(不是'1st' elem也不是'0'),尽量不要引用元素(v[i])的索引,而是v.append,不是好的解决方案,但它可以临时帮助调试您的应用程序:当赋值到/create 'v'时-使其像具有现有元素的列表:v = list(range(1000))

相关问题