我正在尝试访问所有有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})
当我运行此视图时,'学生没有属性' __ getitem __' 会显示在行打印(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()
答案 0 :(得分:1)
如果您使用了更多信息丰富的变量名称,那么您可能会帮助自己,而不是看起来像是在试图让您感到困惑。在您的代码段中:
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})
那就是说,我不明白你的Student has no attribute '__getitem__'
来自哪里,或者为什么要打印而不是提出异常。 __getitem__
用于访问带有整数或切片键的序列项,并且您似乎不会在任何地方执行此操作。根据您在此处提供的模型,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})
然后,您可以在模板和访问students
中迭代student.name
。如果您只想将名称列表传递给模板,可以在查询中使用values_list('name', flat=True)
。
答案 1 :(得分:0)
如果您只想打印学生姓名
for x in students:
print(x.student.name)
student_name.append(x.student)