【问题标题】:How can i group by student id如何按学生证分组
【发布时间】:2022-08-03 14:26:52
【问题描述】:

请我希望任何人帮助我,尝试从讲师会话中对这个学生结果进行分组,以便讲师可以根据提交的课程学生查看每个学生我已经成功获得了一个列表,但该列表没有按学生 ID 分组

这是讲师请求的视图

class LecturerListOfStudentResult(View):
  def get(self, request, *args, **kwargs):
    lecturer = Lecturers.objects.get(admin=request.user.id)
    result = LecturerCourse.objects.filter(lecturer=lecturer)
    context = {
        \'question\':result,
    }
    return render(request, \'superadmin/lecturer/list-result- 
     student.html\', context)

这是所有提交的学生结果视图的列表

class ListAllSubmittedAnswerByCourseRegister(View):
   def get(self, request, *args, **kwargs):
       lecturer = Lecturers.objects.get(admin=request.user.id)
       result = StudentSubmittedAnswer.objects.filter(lecturer=lecturer, 
        student=int(kwargs[\'id\']))
    context = {\'question\':result}
    return render(request, \'superadmin/lecturer/list-all-result- 
    student.html\', context)

这是我只得到计数记录的列表的详细视图

class LecturerListOfStudentResultDetail(View):
    def get(self, request, *args, **kwargs):
       student = Students.objects.get(admin=int(kwargs[\'id\']))
       result = StudentSubmittedAnswer.objects.filter(student=student)
       skipped = StudentSubmittedAnswer.objects.filter(student=student,  
       right_answer=\'Not Submitted\').count()
       attempted = StudentSubmittedAnswer.objects.filter
       (student=student).exclude(right_answer=\'Not Submitted\').count()

       rightAns=0
       percentage=0
       for row in result:
          if row.question.right_opt == row.right_answer:
            rightAns+=1
       if len(result) > 0:
            percentage=(rightAns*100)/result.count()
        return render(request, \'superadmin/lecturer/view-result- 
        detail.html\', {\'result\': result,\'total_skipped\': 
        skipped,\'attempted\': attempted, \'rightAns\': rightAns, 
        \'percentage\':percentage})

这是我的 url.py

path(\'lecturer/course/registration\', 
     LecturerCourseRegistration.as_view(), name=\"lecturer-course- 
     registration\"),
path(\'list/lecturer/course/registration\', 
    ListLecturerCourseRegistration.as_view(), name=\"list-lecturer- 
    course-registration\"),
path(\'list/submitted/course/answer/student/<int:id>/\', 
    ListAllSubmittedAnswerByCourseRegister.as_view(), name=\"list-all- 
    submitted-course-question-by-student\"),

这是学生 html 的列表

{% for r in question %}
   <tr>
     <td>{{ forloop.counter }}</td>
        <td>{{ r.course.name }}</td>
        <td>{{ r.created_at }}</td>
        <td><a  href=\"{% url \'emisapp:list-all-submitted-course- 
    question-by-student\' r.lecturer.admin.id %}\">View</a></td>
{% endfor %}

这是循环为每个学生提交的所有考试的 html 视图

{% for row in result %}
    <tr>
       <td>{{ forloop.counter }}</td>
       <td>{{ row.course.name }}</td>
       <td>{{ row.question.question }}</td>
       <td>{{ row.question.right_opt }}</td>
        {% if row.question.right_opt == row.right_answer %}
           <td class=\"bg-success text-white\">{{ row.right_answer }}</td>
                              {% else %}
           <td class=\"bg-danger text-white\">{{ row.right_answer }}</td>
                              {% endif %}
           </tr>
{% endfor %}

模型.py

class StudentSubmittedAnswer(models.Model):
  id = models.AutoField(primary_key=True)
  course = models.ForeignKey(Courses)
  lecturer = models.ForeignKey(Lecturers)
  question = models.ForeignKey(QuizQuestion)
  student = models.ForeignKey(Students)
  right_answer = models.CharField(max_length=255)
  created_at = models.DateTimeField(auto_now_add=True, null=True)

这是我添加的 Models.py

class StudentSubmittedAnswer(models.Model):
    id = models.AutoField(primary_key=True)
    lecturercourse = models.ForeignKey(LecturerCourse, null=True, 
    related_name=\'studentsubmittedanswer\', on_delete=models.CASCADE)
    lecturer = models.ForeignKey(Lecturers, null=True, 
    related_name=\'studentsubmittedanswer\', on_delete=models.CASCADE)
    question = models.ForeignKey(QuizQuestion, 
    related_name=\'studentsubmittedanswer\', on_delete=models.CASCADE)
    student = models.ForeignKey(Students, 
    related_name=\'studentsubmittedanswer\', null=True, 
    on_delete=models.CASCADE)
    right_answer = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True, null=True)

    标签: python django


    【解决方案1】:

    您可以使用valuesannotate 按学生ID 分组。

    class ListAllSubmittedAnswerByCourseRegister(View):
       def get(self, request, *args, **kwargs):
           lecturer = Lecturers.objects.get(admin=request.user.id)
          => result = StudentSubmittedAnswer.objects.values('student','lecturer').annotate(answers_count=Count('answers')).filter(lecturer=lecturer, 
            student=int(kwargs['id'])).order_by()
        context = {'question':result}
        return render(request, 'superadmin/lecturer/list-all-result- 
        student.html', context)
    

    我假设模型中的字段名称studentanswerslecturer

    参考

    Django 文档:values()、annotate() 和 Count Django 文档:聚合,特别是标题为与默认排序或 order_by() 交互的部分

    https://docs.djangoproject.com/en/4.0/topics/db/aggregation/#order-of-annotate-and-values-clauses

    【讨论】:

    • 谢谢@Abdelaziz El-emary 的回答,但我发现这个错误很奇怪,有故障排除,但有点不知道问题来自哪里,我现在遇到这个问题不知道问题来自哪里可能来自模板或其他东西,NoReverseMatch 位于 /list/submitted/course/answer/student/2/ Reverse for 'view-result-of-student' with arguments '('',)' not found.尝试了 1 种模式:['view/student/result/by/lecturer/(?P<id>[0-9]+)/\\Z']
    • 在问题中添加模型的代码可能是表之间关系的问题
    • 谢谢@Abdelaziz,请检查下面的趋势,刚刚为所述对象添加了我的模型
    猜你喜欢
    • 2017-05-11
    • 2017-10-19
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多