使用动态对象过滤器

时间:2017-08-24 19:07:47

标签: 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(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()

2 个答案:

答案 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)