我有两个模型。我如何计数和显示如下结果:
男235女性
240
其他10我models.py
class Student(models.Model):
name = models.CharField(max_length = 200)
gender = models.ForeignKey(gender, on_delete = models.SET_NULL, null = True, blank=True)
def __str__(self):
return '%s' % (self.name)
class Gender(models.Model):
title= models.CharField(max_length = 200)
def __str__(self):
return '%s' % (self.title)
我views.py
def viewlist(request):
mylist = student.objects.values('gender').annotate(total=Count('gender')).order_by('-total')
您可以使用.annotate(…)
[Django-doc] and.order_by(…)
[Django-doc]:
from django.db.models importCount
gender.objects.annotate(
nstudents=Count('student')
).order_by('-nstudents')
这将对表中的每个gender
,用学生.nstudents
的数量注释对象。如果您这样枚举gender
s,那么对于每个gender
,您可以检索其.nstudents
属性,即与相关的学生的数量。
如果存在与不相关的Student
s的性别,那么这个性别仍然会显示在结果中,因为Django将使用LEFT OUTER JOIN
。
如果你把这个传递给你的视图,那么:
from django.db.models import Count
from django.shortcuts import render
def some_view(request):
genders = gender.objects.annotate(
nstudents=Count('student')
).order_by('-nstudents')
return render(request, 'some-template.html', {'genders': genders})</code></pre>
你可以使用:
{% forgender in genders%}
{{ gender }}: {{gender.nstudents}}<br>
{% endfor %}
注意: Django中的模型是用PascalCase写的,而不是snake_case。所以你可能想把模型从
重命名为gender
Gender
。