如何获得外键字段和计数或其他聚合操作的值?



我有两个模型。我如何计数和显示如下结果:

男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的数量注释对象。如果您这样枚举genders,那么对于每个gender,您可以检索其.nstudents属性,即与相关的学生的数量。

如果存在与不相关的Students的性别,那么这个性别仍然会显示在结果中,因为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

最新更新