Подсчитать количество учеников в школе в Django? Я не получаю результата

class School(models.Model):
 name = models.CharField()
 city = models.CharField()
 street = models.CharField()


class Student(models.Model):
 school_id =  models.ForeignKey(School, on_delete=models.CASCADE)
 first_name = models.CharField()
 last_name = models.CharField()

Я хочу объединить два класса School и Student и получить количество студентов в этих школах, поэтому я написал этот код в моих сериализаторах. но я не получил результата количества студентов, только два объединенных класса. Кто-нибудь может мне помочь?

serializers.py

from django.db.models import Count

class SchoolSerializer(serializers.HyperlinkedModelSerializer):
 class Meta:
    model = School
    fields = ['name']

class StudentSerializer(serializers.HyperlinkedModelSerializer):

  school = SchoolSerializer()

  school.objects.annotate(num_of_students=Count('student'))

  class Meta:
    model = Student
    fields = ['first_name', 'last_name', 'school']

views.py

В моих представлениях я написал следующий код:

 class StudentViewSet(viewsets.ModelViewSet):
  serializer_class = StudentSerializer
  queryset = Student.objects.all()

в вашем models.py добавьте два метода:

class School(models.Model):
     name = models.CharField(max_length=100, null=False, blank=False)
     city = models.CharField(max_length=100, null=False, blank=False)
     street = models.CharField(max_length=100, null=False, blank=False)

def count_of_students(self):
    return Student.objects.filter(school_id=self).count()

def students_in_school(self):
    return list(Student.objects.filter(school_id=self))

def __str__(self):
    return f"{self.city}->{self.street}->{self.name}"


class Student(models.Model):
school_id = models.ForeignKey(School, on_delete=models.CASCADE)
first_name = models.CharField(max_length=100, null=False, blank=False)
last_name = models.CharField(max_length=100, null=False, blank=False)

def __str__(self):
    return f"{self.first_name} {self.last_name}"

и в вашем serializers.py

class StudentSerializer(serializers.Serializer):
first_name = serializers.CharField(max_length=100)
last_name = serializers.CharField(max_length=100)


class SchoolSerializer(serializers.Serializer):
count_of_students = serializers.IntegerField()
name = serializers.CharField(max_length=100)
students_in_school = StudentSerializer(many=True)

и в вашем файле views.py:

def get_school(request, id):
school = School.objects.get(pk=id)
serilizer = SchoolSerializer(school)
json = rest_framework.renderers.JSONRenderer().render(serilizer.data)
from django.http import HttpResponse
return HttpResponse(json, content_type='application/json')

и в вашем urls.py

    path('schools/<int:id>',get_school)

в качестве примера данных вы можете назвать введите описание ссылки здесь

и вот пример вывода:

{

"count_of_students":9, "name": "S1", "students_in_school":[ { "first_name": "surname_1", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_2", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_3", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_4", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_5", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_6", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_7", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_8", "last_name":"surname_{i}" }, { "имя_имя": "фамилия_9", "last_name":"surname_{i}" } ] }

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