Как получить значение поля внешнего ключа и выполнить подсчет или другие операции агрегирования?
У меня есть две модели. Как я могу подсчитать и показать результаты, как показано ниже:
Мужчина 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] и затем .order_by(…)
[Django-doc]:
from django.db.models import Count
gender.objects.annotate(
nstudents=Count('student')
).order_by('-nstudents')
<<<Это позволит для каждого в таблице аннотировать объект с количеством студентов gender
. Если таким образом перечислить все .nstudents
, то для каждого gender
можно получить его gender
атрибут, который является числом .nstudents
связанных студентов.
Если есть пол с не связанными Student
, то этот пол все равно появится в результатах, так как 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>
вы можете вывести количество студентов с:
{% for gender in genders %}
{{ gender }}: {{ gender.nstudents }}<br>
{% endfor %}
Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вgender
Gender
.