Loading

序列化器的嵌套

序列化器的嵌套

(1) 新建一个应用

python manage.py startapp school

(2) 注册应用

INSTALLED_APPS = [
    # 'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    # 'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',  # django原生接口
    'app01',  # drf接口
    'sers',  # 序列化器的使用
    'req',  # drf提供的请求与响应
    'viewdemo',  # 视图
    'school',  # 序列化器的嵌套
    'rest_framework',
]

(3) 新建数据模型

from datetime import datetime

from django.db import models


class Student(models.Model):
    name = models.CharField(max_length=50, verbose_name="姓名")
    age = models.SmallIntegerField(verbose_name="年龄")
    sex = models.CharField(max_length=1, default="男", verbose_name="性别")

    class Meta:
        db_table = "sch_student"

    def __str__(self):
        return self.name


class Course(models.Model):
    name = models.CharField(max_length=50, verbose_name="课程名称")
    teacher = models.ForeignKey("Teacher", on_delete=models.DO_NOTHING, related_name="course", db_constraint=False)

    class Meta:
        db_table = "sch_course"

    def __str__(self):
        return self.name


class Teacher(models.Model):
    name = models.CharField(max_length=50, verbose_name="姓名")
    sex = models.CharField(max_length=1, default="男", verbose_name="性别")

    class Meta:
        db_table = "sch_teacher"

    def __str__(self):
        return self.name


class Achievement(models.Model):
    score = models.DecimalField(default=0, max_digits=4, decimal_places=1, verbose_name="成绩")
    student = models.ForeignKey(Student, on_delete=models.DO_NOTHING, related_name="s_achievement", db_constraint=False)
    course = models.ForeignKey(Course, on_delete=models.DO_NOTHING, related_name="c_achievement", db_constraint=False)
    create_dtime = models.DateTimeField(auto_created=datetime.now())

    class Meta:
        db_table = "sch_achievement"

    def __str__(self):
        return str(self.score)

(4) 数据迁移

python manage.py makemigrations
python manage.py migrate

(5) 创建序列化器

from rest_framework import serializers
from .models import *


class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = "__all__"


class CourseSerializer(serializers.ModelSerializer):
    teacher = TeacherSerializer()

    class Meta:
        model = Course
        fields = ["id", "name", "teacher"]


class AchievementModelSerializer(serializers.ModelSerializer):
    course = CourseSerializer()

    class Meta:
        model = Achievement
        fields = ["id", "score", "course", "create_dtime"]


class StudentSerializer(serializers.ModelSerializer):
    # 多条数据的话要加many=True
    s_achievement = AchievementModelSerializer(many=True)  # s_achievement必须是s_achievement,也就是定义的外键名

    class Meta:
        model = Student
        fields = ["id", "name", "age", "sex", "s_achievement"]

(6) 视图

from rest_framework.viewsets import ModelViewSet
from .models import *
from .serializers import *


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

(7) 路由

from django.urls import path
from . import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register("students", views.StudentModelViewset, basename="students")

urlpatterns = [

] + router.urls

总路由如下:

from django.urls import path, include

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('api/',include('app.urls')),
    path('api/', include('app01.urls')),
    path('sers/', include('sers.urls')),
    path('req/', include('req.urls')),
    path('viewdemo/', include('viewdemo.urls')),
    path('school/', include('school.urls')),

]

(8) 访问效果如下

GET 127.0.0.1:8000/school/students/

[
    {
        "id": 1,
        "name": "小红",
        "age": 22,
        "sex": "女",
        "s_achievement": [
            {
                "id": 1,
                "score": "1.0",
                "course": {
                    "id": 1,
                    "name": "语文",
                    "teacher": {
                        "id": 1,
                        "name": "张老师",
                        "sex": "男"
                    }
                },
                "create_dtime": null
            }
        ]
    },
    {
        "id": 2,
        "name": "小明",
        "age": 23,
        "sex": "男",
        "s_achievement": [
            {
                "id": 2,
                "score": "2.0",
                "course": {
                    "id": 1,
                    "name": "语文",
                    "teacher": {
                        "id": 1,
                        "name": "张老师",
                        "sex": "男"
                    }
                },
                "create_dtime": null
            }
        ]
    },
    {
        "id": 3,
        "name": "小花",
        "age": 21,
        "sex": "女",
        "s_achievement": [
            {
                "id": 3,
                "score": "1.0",
                "course": {
                    "id": 2,
                    "name": "数学",
                    "teacher": {
                        "id": 2,
                        "name": "李老师",
                        "sex": "男"
                    }
                },
                "create_dtime": null
            }
        ]
    },
    {
        "id": 4,
        "name": "张三",
        "age": 24,
        "sex": "男",
        "s_achievement": [
            {
                "id": 4,
                "score": "3.0",
                "course": {
                    "id": 3,
                    "name": "英语",
                    "teacher": {
                        "id": 3,
                        "name": "王老师",
                        "sex": "女"
                    }
                },
                "create_dtime": null
            },
            {
                "id": 5,
                "score": "2.0",
                "course": {
                    "id": 4,
                    "name": "操作系统",
                    "teacher": {
                        "id": 1,
                        "name": "张老师",
                        "sex": "男"
                    }
                },
                "create_dtime": null
            }
        ]
    },
    {
        "id": 5,
        "name": "李四",
        "age": 25,
        "sex": "男",
        "s_achievement": []
    },
    {
        "id": 6,
        "name": "王二",
        "age": 20,
        "sex": "男",
        "s_achievement": []
    }
]
posted @ 2022-10-24 17:27  minqiliang  阅读(74)  评论(0编辑  收藏  举报
-->