Как получить значение поля внешнего ключа и выполнить подсчет или другие операции агрегирования?

У меня есть две модели. Как я могу подсчитать и показать результаты, как показано ниже:

Мужчина 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.

Вернуться на верх