【问题标题】:How to get count of model objects in django如何在 django 中获取模型对象的数量
【发布时间】:2021-05-04 11:55:21
【问题描述】:

有人能向我解释为什么我无法计算查询的内容吗? 我想统计每个学生借的所有书籍

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's 我在视图中称它为错误的代码方式吗????

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)

【问题讨论】:

    标签: python django django-views django-templates


    【解决方案1】:

    你应该可以用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})
    

    【讨论】:

    • 每个学生都给我这个。, , ]>。我已经用我的模型编辑了我的问题
    • 尝试在模板中访问student.issue__count
    • 我编辑了你应该如何实现它。
    【解决方案2】:

    问题是,每次你遍历问题时,你都在重新声明所借用的变量。因此,当循环结束时,你会得到最后一个人借的书的数量(即问题查询集的最后一个问题实例)。这就是为什么你可能会得到一个零。

    【讨论】:

      【解决方案3】:

      您将在 for 循环的每次迭代中覆盖 borroweds。 不要遍历 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 %}
      

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 2021-02-14
        • 2021-11-13
        • 2017-10-27
        • 1970-01-01
        • 2011-07-07
        • 2015-08-03
        • 2019-01-25
        • 2020-04-06
        相关资源
        最近更新 更多