首页 > 解决方案 > 如何在 django 中获取模型对象的数量

问题描述

有人会尝试向我解释为什么我无法计算查询是什么。 我想统计每个学生借的所有书

def view_student(request):  
    issues = Student.objects.all()
    for issue in issues:
        borroweds = Issue.objects.filter(borrower_id__student_id = issue.student_id).count()
        print(borroweds)
    return render(request, 'view_student.html', {'borroweds':borroweds})

tml 代码是这样的。

{% for student in students %}
    <tr>
      <td>{{ forloop.counter }}</td>
      <td>{{ student.student_id }}</td>
      <td>{{ student.name }}</td>
      <td>{{ student.batch }}</td>
      <td>{{ student.semester }}</td>
      <td><a href="{% url 'all_borrowed' student.student_id %}"> {{ borroweds }}</a> </td>
     </tr>
  {% endfor %}

这给了我所有借书的学生的名单print(borroweds)

而在模板中{{ borroweds }}给我0的是我在视图中称它为错误的代码方式吗????

class Student(models.Model):
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
student_id = models.CharField(max_length=20, unique=True)

class Issue(models.Model):
    borrower_id = models.ForeignKey(Student,on_delete=models.CASCADE)
    book_id = models.ForeignKey(Books,on_delete=models.CASCADE)
    issue_date = models.DateField(default=datetime.date.today)

标签: pythondjangodjango-viewsdjango-templates

解决方案


您在borrowedsfor 循环的每次迭代中都将被覆盖。不要遍历 Django 查询集,通常不需要这样做。

相反,请使用注释和计数。

from django.db.models import Count

def view_student(request):  
    students = Student.objects.annotate(borrowed_books=Count('issue'))
    return render(request, 'view_student.html', {'students':student})

在您的模板中,您可以通过以下方式访问它:

{% for student in students %}
{{ student.borrowed_books }}
{% endfor %}

推荐阅读