Python 使用动态对象过滤器

Python 使用动态对象过滤器,python,django,Python,Django,我正在尝试访问所有分数为100的学生的姓名 def get_names(request): students = Result.objects.filter(marks=100) student_name = [] for x in students: student_name.append(x.student) for x in student_name: print (x.name) return render(requ

我正在尝试访问所有分数为100的学生的姓名

def get_names(request):
    students = Result.objects.filter(marks=100)
    student_name = []
    for x in students:
        student_name.append(x.student)
    for x in student_name:
        print (x.name)
    return render(request, 'exam/index.html', {'names': student_name})
当我运行此视图时,“Student has no attribute”\uuuu getitem\uuuuuuuuuuu“显示在打印行(x.name)上。 我读了一些关于动态对象过滤器的内容,但在本例中无法理解

模型结构

class Student(models.Model):
    name = models.CharField(max_length=20)
    stream = models.CharField(max_length=20)


class Result(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    marks = models.IntegerField()

如果你想打印学生的名字

for x in students:
    print(x.student.name)
    student_name.append(x.student)

如果您使用了更多信息丰富的变量名,而不是似乎不厌其烦地提出令人困惑的变量名,那么您将受益匪浅。在代码段中:

def get_names(request):
    results = Result.objects.filter(marks=100)
    students = []
    for result in results:
        students.append(result.student)
    for student in students:
        print(student.name)
    return render(request, 'exam/index.html', {'names': student_name})
也就是说,我不明白你的
学生没有属性“\uuu getitem\uuuu”
是从哪里来的,也不明白为什么要打印它而不引发异常
\uuuu getitem\uuuu
用于访问具有整数键或切片键的序列项,而您似乎在任何地方都没有这样做。根据您在这里介绍的模型,
x
(或我的代码中的
student
)应该是
student
实例,并且执行
print(x.name)
应该可以

在任何情况下,您都可以用一种更简单的方式:

def get_names(request)
    students = Student.objects.filter(result__marks=100).distinct()
    return render(request, 'exam/index.html', {'students': students})

然后您可以在模板中迭代
student
,并访问
student.name
。如果只想将名称列表传递给模板,可以在查询中使用
values\u list('name',flat=True)

我的主要目标是将名称列表传递给网页。但是,当发生上述错误时,我添加了几行额外的代码,以便在Python控制台上打印列表。谢谢我将修改变量名。谢谢你的建议