Как использовать метод Different () без применения метода values ​​() с использованием Django? - PullRequest
1 голос
/ 16 января 2020

Это мой текущий код в views.py

students = grade.objects.filter(Teacher=m.id).annotate(total_avg=Avg('Average')).prefetch_related('Subjects').order_by('Students_Enrollment_Records').distinct()

это результат:

enter image description here

Как вы можете увидеть, что существует 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()

, результат будет

enter image description here

Применяется метод Different (), который вычисляет итоговые оценки, но, как видно, имя учителя, предмет и ученики не отображались.

Это мой 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 %}

Мои модели.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?

Можете ли вы объяснить мне, почему, когда я использую значения (), имя идентификатора дисплея ученика (56 и 57) только не имя, как показано на картинке?

enter image description here

ОБНОВЛЕНИЕ при использовании

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)

enter image description here

ФИО учителя и ученика, подп. ject не отображаются.

когда я попробовал это

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

это результат

enter image description here

1 Ответ

2 голосов
/ 16 января 2020

не могли бы вы, ребята, объяснить, почему, когда я использую значения (), имя студенческого дисплея (56 и 57) только не имя ??

Как docs говорит

Метод values ​​() принимает необязательные позиционные аргументы, * поля, которые определяют имена полей, которыми должен быть ограничен SELECT

Так что когда Вы звоните values('Students_Enrollment_Records'), в результате вы получили только этот идентификатор внешнего ключа

Добавьте дополнительные поля в values(), и вы получите их тоже в результате

Например, если вам нужно имя Students_Enrollment_Records объект модели и он хранится в поле модели name, вы должны добавить 'Students_Enrollment_Records__name' к значениям ()

В конце это решение было использовано для этого случая:

запрос

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 %}
...