[英]How to use distinct() method without applying values() method using Django?
这是我当前在 views.py 中的代码
students = grade.objects.filter(Teacher=m.id).annotate(total_avg=Avg('Average')).prefetch_related('Subjects').order_by('Students_Enrollment_Records').distinct()
这是结果:
正如你所看到的 2 ROSE L TRiNIDAD 存在,它没有计算最终评级,但是当我使用values()
students=grade.objects.values('Students_Enrollment_Records').filter(Teacher=m.id).annotate(total_avg=Avg('Average')).prefetch_related('Students_Enrollment_Records').order_by('Students_Enrollment_Records').distinct()
结果是
应用了 distinct() 方法并计算最终评分,但正如您所看到的,没有显示教师、科目和学生的姓名。
这是我的 html:
{% for student in students %}
<tr>
<td>{{student.Teacher}}</td>
<td>{{student.Subjects}}</td>
<td>{{student.Students_Enrollment_Records}}</td>
<td>{{student.total_avg}}</td>
</tr>
{% endfor %}
我的models.py:
class StudentsEnrolledSubject(models.Model):
Students_Enrollment_Records = models.ForeignKey(StudentsEnrollmentRecord, related_name='+',
on_delete=models.CASCADE, null=True)
Subject_Section_Teacher = models.ForeignKey(SubjectSectionTeacher, related_name='+', on_delete=models.CASCADE,
null=True)
class grade(models.Model):
Teacher = models.ForeignKey(EmployeeUser, related_name='+', on_delete=models.CASCADE,
null=True, blank=True)
Grading_Categories = models.ForeignKey(gradingCategories, related_name='+', on_delete=models.CASCADE,
null=True, blank=True)
Subjects = models.ForeignKey(Subject, related_name='+', on_delete=models.CASCADE, null=True)
Students_Enrollment_Records = models.ForeignKey(StudentsEnrolledSubject, related_name='+',
on_delete=models.CASCADE, null=True)
Average = models.FloatField(null=True, blank=True)
class EmployeeUser(models.Model):
Image = models.ImageField(upload_to='images', null=True, blank=True)
Employee_Number = models.CharField(max_length=500, null=True)
Username = models.CharField(max_length=500, null=True)
Password = models.CharField(max_length=500, null=True)
.
.
注意:这是一个不同的问题,结果相同, 如何在 django 中使用不同的方法时使用过滤数据?
您能否向我解释为什么当我使用 values() 时,学生显示 ID(56 和 57)的名称而不是名称,如图所示?
当我使用时更新
students=grade.objects.values('Students_Enrollment_Records__Students_Enrollment_Records').filter(Teacher=m.id).annotate(total_avg=Avg('Average')).prefetch_related('Students_Enrollment_Records').order_by('Students_Enrollment_Records').distinct()
class StudentsEnrollmentRecord(models.Model):
Student_Users = models.ForeignKey(StudentProfile, related_name='students', on_delete=models.CASCADE, null=True)
School_Year = models.ForeignKey(SchoolYear, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
Courses = models.ForeignKey(Course, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
Section = models.ForeignKey(Section, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
Payment_Type = models.ForeignKey(PaymentType, related_name='+', on_delete=models.CASCADE, null=True)
Discount_Type = models.ForeignKey(Discount, related_name='+', on_delete=models.CASCADE, null=True, blank=True)
Education_Levels = models.ForeignKey(EducationLevel, related_name='+', on_delete=models.CASCADE, blank=True,
null=True)
Remarks = models.TextField(max_length=500, null=True, blank=True)
老师和学生的名字,主题不显示。
当我尝试这个时
students=grade.objects.values('Teacher', 'Subjects', 'Students_Enrollment_Records').filter(Teacher=m.id).annotate(total_avg=Avg('Average')).prefetch_related('Students_Enrollment_Records').order_by('Students_Enrollment_Records').distinct()
这是结果
你们可以向我解释为什么当我使用 values() 时,学生显示 ID(56 和 57)的名称而不是名称?
正如文档所说
values() 方法采用可选的位置参数 *fields,它指定 SELECT 应限制到的字段名称
因此,当您调用values('Students_Enrollment_Records')
,结果中只有这个外键 ID
在values()
添加更多字段,您也会在结果中获得它们
例如,如果您需要Students_Enrollment_Records
模型对象的名称并且它存储在模型字段name
您应该将'Students_Enrollment_Records__name'
添加到 values()
询问
students = grade.objects.filter(Teacher=m.id).values('Teacher__Username', 'Subjects__Description', 'Students_Enrollment_Records__Students_Enrollment_Records__Student_Users__Username').annotate(total_avg=Avg('Average')).order_by('Students_Enrollment_Records').distinct()
html
{% for student in students %}
<tr>
<td>{{student.Teacher__Username}}</td>
<td>{{student.Subjects__Description}}</td>
<td>{{student.Students_Enrollment_Records__Students_Enrollment_Records__Student_Users__Username}}</td>
<td>{{student.total_avg}}</td>
</tr>
{% endfor %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.