如何在Django中获取模型对象的数量

2024-09-29 06:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有人能给我解释一下,为什么我无法计算出这个问题是什么。 我想数一数每个学生借的所有书

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)

Tags: viewidonmodelsrequestissuedeletestudent
3条回答

在for循环的每次迭代中,您都要覆盖borroweds。 不要迭代Django查询集,通常不需要这样做

相反,使用annotate和count

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

问题是,每次循环处理问题时,都会重新声明borroweds变量。因此,当循环结束时,最后一个人(即issues queryset的最后一期实例)借的书的数量将留给您。这就是你可能得到零分的原因

您应该能够使用Aggregation: Following relationships backwards执行类似的操作

这不是开箱即用的,我不确定你的模型是如何设计的。如果你发布它们,我可以进一步帮助你

如果您对模型进行了自定义,它会将字段issue__count添加到每个Student

from django.db.models import Count

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

相关问题 更多 >