繁体   English   中英

如何在不使用 Django 应用 values() 方法的情况下使用 distinct() 方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM