Как использовать фильтрацию данных при использовании отдельного метода в Django?

Пожалуйста, помогите мне в моей проблеме. Надеюсь, моего названия достаточно, чтобы понять, что я имею в виду, пожалуйста, помогите мне в этой проблеме, ребята.

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

id_list = grade.objects.filter(Teacher=m.id).values_list('Students_Enrollment_Records_id',flat=True).distinct()

введите описание изображения здесь Я использую distinct() чтобы исключить повторяющиеся строки записи о регистрации студентов из результатов запроса, но мне интересно, почему результат такой:

введите описание изображения здесь

Что я должен сделать, чтобы в моем html-файле отображалось имя «Студенты», а не «QuerySet»?

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

id_list = grade.objects.filter(Teacher=m.id).values_list('Students_Enrollment_Records_id',flat=True).distinct()
print(id_list)
grades = grade.objects.filter(Students_Enrollment_Records_id__in=id_list)
print(grades)

Это мой models.py :

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)

ОБНОВИТЬ

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

piste = grade.objects.filter(Teacher_id=m.id).values_list('Students_Enrollment_Records').annotate(Average=Avg('Average')).order_by('Grading_Categories').distinct()

вычисление исправлено, но имя учителя, тема и имя ученика не отображались, но идентификатор отображается так

введите описание изображения здесь

это мое желание ответ

введите описание изображения здесь

вот как я публикую в html

views.py

return render(request, 'Homepage/index.html', {"piste":piste})

HTML

{% for n in piste %}
          <tr>
              <td>{{n.Teacher}}</td>
              <td>{{n.Subjects}}</td>
              <td>{{n.Students_Enrollment_Records.Students_Enrollment_Records.Student_Users}}</td>
              <td>{{n}}</td>
          </tr>
          {% endfor %}

Это model.py

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)
    My_Department = models.ForeignKey(Department, related_name='+', on_delete=models.CASCADE, blank=True)
    My_Position = models.ForeignKey(Position, related_name='+', on_delete=models.CASCADE, blank=True)
    Firstname = models.CharField(max_length=500, null=True)
    Middle_Initial = models.CharField(max_length=500, null=True)
    Lastname = models.CharField(max_length=500, null=True)
    Educational_Attainment = models.ForeignKey(EducationalAttainment, related_name='+', on_delete=models.CASCADE,
                                               null=True)
    Landline = models.CharField(max_length=500, null=True)
    Mobile_Number = models.CharField(max_length=500, null=True)
    Email = models.CharField(max_length=500, null=True)
    Facebook_Acoount = models.CharField(max_length=500, null=True)

    Fathers_Firstname = models.CharField(max_length=500, null=True)
    Fathers_Middle_Initial = models.CharField(max_length=500, null=True)
    Fathers_Lastname = models.CharField(max_length=500, )
    Educational_Attainment_Father = models.ForeignKey(EducationalAttainment, related_name='+', on_delete=models.CASCADE,
                                                      null=True)
    Father_Occupation = models.CharField(max_length=500, null=True)
    Father_Company_Employed = models.CharField(max_length=500, null=True)
    Father_Landline = models.CharField(max_length=500, null=True)
    Father_MobileNo = models.CharField(max_length=500, null=True)
    Father_Email = models.CharField(max_length=500, null=True)
    Father_Facebook_Account = models.CharField(max_length=500, null=True)

    Mother_FirstName = models.CharField(max_length=500, null=True)
    Mother_Middle_Initial = models.CharField(max_length=500, null=True)
    Mother_Maiden_LastName = models.CharField(max_length=500, null=True)
    Educational_AttainmentID_Mother = models.ForeignKey(EducationalAttainment, related_name='+',
                                                        on_delete=models.CASCADE, null=True)
    Mother_Occupation = models.CharField(max_length=500, null=True)
    Mother_Company_Employed = models.CharField(max_length=500, null=True)
    Mother_Landline = models.CharField(max_length=500, null=True)
    Mother_MobileNo = models.CharField(max_length=500, null=True)
    Mother_Email = models.CharField(max_length=500, null=True)
    Mother_Facebook_Account = models.CharField(max_length=500, null=True)
    Family_Status = models.ForeignKey(FamilyStatu, related_name='+', on_delete=models.CASCADE, null=True)
    Country = models.CharField(max_length=500, null=True)
    ZIP_Postal_Code = models.CharField(max_length=500, null=True)
    State_Province = models.CharField(max_length=500, null=True)
    City = models.CharField(max_length=500, null=True)
    Barangay = models.CharField(max_length=500, null=True)
    Unit_Number_Street = models.CharField(max_length=500, null=True)
    LandMark = models.CharField(max_length=500, null=True)
    AddressLine1 = models.CharField(max_length=500, null=True)
    AddressLine2 = models.CharField(max_length=500, null=True)
    AddressLine3 = models.CharField(max_length=500, null=True)

    def __str__(self):
        suser = '{0.Firstname}   {0.Middle_Initial}      {0.Lastname}'
        return suser.format(self)

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)

это полный view.py

m = EmployeeUser.objects.get(Username=request.POST['p_user'], Password = request.POST['p_pass'], My_Position =request.POST['position'])
piste = grade.objects.all().filter(Teacher=m.id).values_list('Students_Enrollment_Records').annotate(Average=Avg('Average')).order_by('Grading_Categories').distinct()
return render(request, 'Homepage/index.html', {"piste":piste})

ОБНОВИТЬ

когда я попробовал этот ответ от mr @ nigel222

piste = grade.objects.filter(Teacher=m.id).annotate(grade_average=Avg('Average')).order_by('Grading_Categories').distinct()

и на мой HTML

{% for n in piste %}
      <tr>
          <td>{{n.Teacher}}</td> <!-- 1 -->
          <td>{{n.Subjects}}</td> <!-- 2 -->
          <td>{{n.Students_Enrollment_Records.Students_Enrollment_Records.Student_Users}}
               </td>  <!-- 3 -->
          <td>{{n}}</td>  <!--4 -->
      </tr>
      {% endfor %}

я получаю этот результат

введите описание изображения здесь

Всего 3 ответа


Я не очень много работал с Джанго в течение нескольких лет, но я думаю, что это происходит.

Вы назначаете список значений (кортеж) для piste . Вы не назначаете объекты grade для piste . Однако в вашем шаблоне вы ожидаете, что элементы piste будут оценками.

Я считаю, что вам нужно сначала получить объект grade и отправить его в шаблон, а также в piste .


Вы не хотите values_list (это данные, которые вы получаете в столбце 4). Вам нужен набор запросов объектов grade :

piste = grade.objects.filter(Teacher_id=m.id
        ).annotate(Average=Avg('Average')
        ).order_by('Grading_Categories'
        ).distinct()

а затем в вашем шаблоне, что-то вроде

{% for n in piste %}
      <tr>
          <td>{{n.Teacher}}</td> <!-- 1 -->
          <td>{{n.Subjects}}</td> <!-- 2 -->
          <td>{{n.Students_Enrollment_Records.Students_Enrollment_Records.Student_Users}}
               </td>  <!-- 3 -->
          <td>{{n}}</td>  <!--4 -->
      </tr>
      {% endfor %}

1 и 2 отображают объекты EmployeeUser и Subject . 1 вернет __str__ представление EmployeeUser которое должно быть в порядке. В качестве альтернативы вы можете явно использовать {{n.Teacher.FirstName}} и т. Д. В своем шаблоне.

3 Я не понимаю, потому что вы не показываете модель Students_Enrolled_Subject .

4 сейчас не так. Возможно, вы хотите аннотацию {{n.Average}} ?

Пожалуйста, как можно скорее, научитесь использовать соглашения о кодировании Django / Python. Подклассы Model (и имена классов Python в целом) начинаются с заглавной буквы. Экземпляры классов строчные. Имена / атрибуты полей обычно строчные и начинаются со строчной буквы. Имена подклассов моделей - это единственное имя, а не имя во множественном числе. Не делать это ужасно смущает любого опытного кодера Django. Так,

class Grade(models.Model):
    teacher = models.ForeignKey(EmployeeUser, related_name='+', on_delete=models.CASCADE,
                            null=True, blank=True)
    grading_categories = models.ForeignKey(GradingCategory, related_name='+', on_delete=models.CASCADE,
                                       null=True, blank=True)
    subject = 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)

Это лучшее, что я могу для тебя сделать. Я думаю, что вы должны быть выбраны на основе ученика и фильтрации оценок для учителя. Я также сделал предварительную выборку для всех предметов, так как не могу точно сказать, что вам нужно сделать там.

students = Student.objects.filter(
    grades__teacher_id=teacher.id,
).annotate(
    total_avg=Avg('grades__Average')
).prefetch_related('grades__Subjects')

Шаблон:

{% for student in students %}
      <tr>
          <td>{{teacher}}</td>
          <td>{{student.grades.subjects.all}}</td>
          <td>{{student}}</td>
          <td>{{student.total_avg}}</td>
      </tr>
{% endfor %}

Есть идеи?

10000