簡體   English   中英

在 django 中使用不同的方法時如何使用過濾數據?

[英]How to use filtering data while using distinct method in 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()

計算是固定的,但老師姓名,科目和學生姓名沒有顯示,但ID顯示就像這樣

在此處輸入圖片說明

這是我想要的答案

在此處輸入圖片說明

這就是我在 html 中發布的方式

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

這是模型.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})

更新

當我嘗試@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 %}

我得到這個結果

在此處輸入圖片說明

我已經有幾年沒有與 Django 一起工作了,但這就是我認為正在發生的事情。

你分配values_list(元組)到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 渲染EmployeeUserSubject對象。 1 將返回EmployeeUser__str__表示,這應該沒問題。 或者,您可以在模板中明確使用{{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 %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM