Подсчитать количество учеников в школе в 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}" } ] }