0
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 并获取这些学校的学生人数,所以我在我的序列化程序中编写了这段代码。但是我没有得到学生人数的结果,只有两个班级加入了。有人能帮我吗?

序列化程序.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']

视图.py

在我看来,我写了以下代码:

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

1 回答 1

0

在你的 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}"
      },
      {
         "first_name":"surname_2",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_3",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_4",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_5",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_6",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_7",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_8",
         "last_name":"surname_{i}"
      },
      {
         "first_name":"surname_9",
         "last_name":"surname_{i}"
      }
   ]
}
于 2021-11-02T16:53:02.073 回答