2017-08-24 44 views
0

我試圖訪問具有標誌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() 

回答

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}) 

然後你可以遍歷在模板和接取student.namestudents。如果您只是想將一個名稱列表傳遞給模板,則可以在查詢中使用values_list('name', flat=True)

+0

它的工作。謝謝!我將修改變量名稱。感謝您的建議 – rohit1248

0

如果你只想打印學生姓名

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

我的主要目標是將名稱列表傳遞給網頁。但是,當上述錯誤發生時,我添加了幾行額外的行來在Python控制檯上打印列表。 – rohit1248