Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术

在这里插入图片描述

系列文章目录

  • Django入门全攻略:从零搭建你的第一个Web项目
  • Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
  • Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
  • Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
  • 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
  • Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
  • Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
  • Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
  • Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用
  • Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
  • 还在写0.0…

文章目录

  • 系列文章目录
  • 前言
  • 一、关联序列化器序列化
    • 1. 多表 序列化 模型类创建
    • 2. StringRelated外键序列化
    • 3. SlugRelated外键序列化
    • 4. PrimaryKeyRelated外键序列化
    • 5. 外键自定义序列化方式
    • 一对多关系模型序列化(反向查询)
    • 多对多关联模型序列化(正向查询)
    • 6. 嵌套关系
      • 1.多对多关系模型 的嵌套关系(正向)
      • 2.一对多关系模型 的嵌套关系(正向)
      • 3. 多对多关系模型 的嵌套关系(反向)
  • 二、关联序列化器反序列化
    • 1. 默认关联反序列化方式(简单情况下)
    • 2. 多对多关联模型反序列化方式


前言

    在Django REST framework中,关联序列化器 是解锁复杂数据关系的强大工具。从多表模型创建到外键序列化的多种方法,再到一对多、多对多关系的嵌套处理,关联序列化器让数据操作更加高效和准确。
    接下来,我们将深入了解如何创建多表模型,掌握外键序列化的四种技巧,包括StringRelated、SlugRelated、PrimaryKeyRelated以及自定义外键序列化,并探讨一对多、多对多关系模型的嵌套关系处理。更重要的是,我们还将探讨关联序列化器的反序列化过程,让你的数据操作更加得心应手。


一、关联序列化器序列化

关联序列化器的序列化 主要涉及在Django中将具有关联关系的 模型实例 转换为适合网络传输或存储的格式(json),并通过 嵌套序列化器 来处理关联对象。这是Django REST framework中实现复杂数据模型序列化的重要功能之一。

  • 当Django模型之间存在关联关系(如外键、多对多关系等)时,我们需要一种方式来同时序列化这些关联对象。这就是 关联序列化器 的概念。
  • 关联序列化器 允许我们在 主序列化器 中嵌套另一个序列化器,以处理关联对象。例如,如果一个Teacher模型有一个Student模型的外键关系,我们可以创建一个TeacherSerializer,并在其中嵌套一个StudentSerializer来处理Teacher的学生列表。

1. 多表 序列化 模型类创建

之前的序列化,只是简单的对一张表进行处理,如果遇到多表,且是有关联的,如一对一多对一多对多的情况该怎么序列化呢?


比如现在有两张很常见的关联表班级表学生表

  • 一个班级可以有一群学生,但是一个学生同时只能属于一个班级,对应的数据库关系就是多对一(外键关系设置在’多’,即学生表中)的关系,模型类 如下:
# models.py
#班级模型类 一
class ClassModel(models.Model):
    name = models.CharField(max_length=50)
    num = models.IntegerField(max_length=18)
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'cla'

#学生模型类 多
class StudentModel(models.Model):
    GENDER_CHOICES = {
        (1, '男'),
        (2, '女'),
        (3, '保密'),
    }
    name = models.CharField(max_length=50)
    age = models.IntegerField(max_length=18)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)
    info = models.CharField(max_length=100, null=True)
    cla = models.ForeignKey(to=ClassModel, on_delete=models.SET_NULL, null=True)
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'student'

添 加 studentSerializer.py,view_stu.py,urls.py,代码如下:

# studentSerializer.py:
from rest_framework import serializers
from app.models import StudentModel

class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    class Meta:
	   model = StudentModel
	   fields = '__all__'
	   
-----------------------------------------------
# view_stu.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app.models import StudentModel
from app.serializer.studentSerializer import StudentSerializer

class StudentViews(APIView):
    def get(self, request):
        # 学生信息
        #序列化
        stus = StudentModel.objects.all()
        # stus[0].teachermodel_set.all()
        
        stuSer = StudentSerializer(instance=stus, many=True)

        return Response({"message":"[GET]StudentViews请求成功!", "data": stuSer.data})

------------------------------------------------
# urls.py

from django.urls import path
from app.views_stu import StudentViews

urlpatterns = [
    path('students/', StudentViews.as_view()),
]

查询所有学生信息,效果图如下:
在这里插入图片描述


上图中 "cla":1 — 显示班级cla的主键,而不显示班级名?如何解决?

学生表(StudentModel)中,包含外键 cla ,外键可以通过如下一些方式进行序列化

  • StringRelated外键序列化
  • SlugRelated外键序列化
  • PrimaryKeyRelated外键序列化
  • 外键自定义序列化方式

2. StringRelated外键序列化

关联表__str__方法作为结果返回,设置read_only 代表该字段不进行 反序列化校验

# studentSerializer.py 添加 StringRelatedField 字段
class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50,min_length=2,error_messages={"min_length":"姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)

    # 1.将关联表中的 __str__中的内容作为返回结果进行序列化
    cla = serializers.StringRelatedField(read_only=True) #只在序列化时使用,反序列化时不需要
    
    class Meta:
	    model = StudentModel # 绑定StudentModel模型类
	    fields = "__all__"

StringRelated外键序列化后,查询所有学生信息,效果图如下:
在这里插入图片描述

3. SlugRelated外键序列化

使用 关联表的指定字段 作为结果返回

# studentSerializer.py 添加 SlugRelatedField字段
class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    # 2.指定关联表中的指定字段==slug_field='num'==作为返回结果进行序列化
    cla = serializers.SlugRelatedField(read_only=True,slug_field='name')
    # cla = serializers.SlugRelatedField(read_only=True,slug_field='num')
    class Meta:
        model = StudentModel
        fields = '__all__'

SlugRelatedField外键序列化(分别指定字段namenum)后,查询所有学生信息,效果图如下:


cla = serializers.SlugRelatedField(read_only=True,slug_field='name')在这里插入图片描述


cla = serializers.SlugRelatedField(read_only=True,slug_field='num')
在这里插入图片描述

4. PrimaryKeyRelated外键序列化

关联表主键作为结果返回,使用PrimaryKeyRelatedField字段,该字段需要包含querysetread_only属性

# studentSerializer.py 添加 PrimaryKeyRelatedField字段
class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50,min_length=2,error_messages={"min_length":"姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    # 3.返回关联表中的主键id字段,作为返回结果并进行序列化
    cla = serializers.PrimaryKeyRelatedField(read_only=True)
    class Meta:
        model = StudentModel
        fields = '__all__'

PrimaryKeyRelated外键序列化后(与不添加外键序列化字段时 即默认情况下效果相同,都显示班级id),查询所有学生信息,效果图如下:


在这里插入图片描述

5. 外键自定义序列化方式

在序列化的时候,如果想自定义获取对应的关联表中的数据的时候,就需要自己构建序列化字段, 此时默认的外键不发生改变,新添加序列化字段,来达到序列化自定义字段的效果
serializers.SerializerMethodField(read_only=True)

# studentSerializer.py 添加 SerializerMethodField 自定义字段 
class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    
    
    # 4. 自定义字段,作为序列化字段,需要配合自定义的函数使用,
    gender = serializers.SerializerMethodField(read_only=True)
    def get_gender(self,obj):
        '''
        函数名的构成:前面添加`get_`,后面跟的是自定义字段名,组合成函数名,
        return:结果就是序列化内容
        obj:指的是当前模型类对象
        -- 覆盖gender----  get_gender_display()
        '''
        return obj.get_gender_display()

    # 4. 自定义字段
    xxxx = serializers.SerializerMethodField()
    def get_xxxx(self, obj): #obj-当前学生对象
        return obj.cla.name # 多对多不行


    class Meta:
        model = StudentModel
        fields = '__all__'

添加自定义字段genderxxxx后,查询所有学生,效果图如下:
在这里插入图片描述


一对多关系模型序列化(反向查询)

以上介绍的都是一对多情况下,正向查询(通过student查询class),下面将介绍反向查询(通过cla查询student)

ClassModel中可以看出,班级模型类并不显性持有学生信息,但可通过 反向查询 隐式获取学生信息

一对多时,通过班级cla反向查询学生 student
添加classSerializer.py,view_cla.py,urls.py

# classSerializer.py
class ClassSerializer(serializers.ModelSerializer):
    # Z自定义字段---通过班级反向查询学生---多对一时
    studentname = serializers.SerializerMethodField()
    def get_studentname(self, obj): # obj--cla模型对象
        names = ""
        for st in obj.studentmodel_set.all():
            names += st.name
        return names


    name = serializers.CharField(max_length=50, min_length=1, validators=[nameValidators])
    class Meta:
        model = ClassModel
        fields = '__all__'
--------------------------------------------------------------------
# view_cla.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app.models import ClassModel
from app.serializer.classSerializer import ClassSerializer

class ClassViews(APIView):
    def get(self, request):

        clas = ClassModel.objects.all()
        # clas[0].studentmodel_set

        claSer = ClassSerializer(instance=clas, many=True)

        return Response({"message":"[get]ClassViews测试成功!",'data':claSer.data})

-------------------------------------------------------------
# urls.py
from django.urls import path
from app.views_stu import StudentViews
from app.views_cla import ClassViews

urlpatterns = [
    path('students/', StudentViews.as_view()),
    path('classes/', ClassViews.as_view()),

]

一对多情况下,增加自定义字段 studentname ( studentname通过反向查询获得 )后,查询班级cla信息的的前后对比图:


添加自定义字段 studentname 前:
在这里插入图片描述


添加自定义字段 studentname 后:
在这里插入图片描述

多对多关联模型序列化(正向查询)

多对多反向获取数据时与刚刚介绍的一对多情况下获取数据操作相同。正向呢?
PS:多对多时,添加teacher信息,teacher与student构成多对多关系

在 models.py 中添加 TeacherModel 模型类:

# 教师模型类
class TeacherModel(models.Model):
    GENDER_CHOICES = {
        (1, '男'),
        (2, '女'),
        (3, '保密'),
    }
    name = models.CharField(max_length=50)
    age = models.IntegerField(max_length=18)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)
    info = models.CharField(max_length=100, null=True)
    # ++++添加与学生的多对多关系
    student = models.ManyToManyField(to=StudentModel)

    def __str__(self):
        return self.name
    class Meta:
        db_table = 'teacher'

添加 teacherSerializer.py,view_teacher.py,urls.py

# teacherSerializer.py
from rest_framework import serializers
from app.models import TeacherModel

class TeacherSerializer(serializers.ModelSerializer):

    class Meta:
        model = TeacherModel
        fields = '__all__'
        
----------------------------------------------------------------
# views_teacher.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app.serializer.teacherSerializer import TeacherSerializer
from app.models import TeacherModel

class TeacherViews(APIView):
    def get(self, request):
        teac = TeacherModel.objects.all()

        teacSer = TeacherSerializer(instance=teac, many=True)
        return Response({"message": "测试成功!", "teacList": teacSer.data})

----------------------------------------------------------------------
# urls.py
from django.urls import path
from app.views_stu import StudentViews
from app.views_cla import ClassViews
from app.views_teacher import TeacherViews

urlpatterns = [
    path('students/', StudentViews.as_view()),
    path('classes/', ClassViews.as_view()),
    path('teachers/', TeacherViews.as_view()),

]

查询 teacher 信息,效果图如下:
在这里插入图片描述

上图中student外键字段显示的是student 的 id,如何显示学生姓名或者其他信息呢? 可以上文中介绍过的外键序列化的几种方式

teacherSerializer.py 中通过 SlugRelatedField字段 使图中的 student字段 显示学生名:

# teacherSerializer.py 添加 SlugRelatedField 字段 指定 显示 `name`
from rest_framework import serializers
from app.models import TeacherModel

class TeacherSerializer(serializers.ModelSerializer):
    student = serializers.SlugRelatedField(slug_field='name', many=True, read_only=True)

    class Meta:
        model = TeacherModel
        fields = '__all__'

添加 SlugRelatedField 指定字段后,查询teachers,效果图如下:(student由 id --> name)
在这里插入图片描述

6. 嵌套关系

嵌套序列化 :关联关系的模型类。将需要被嵌套的序列化器,引入到当前序列化器中。如果对应关系是多个,需要注意添加 many = true


反向嵌套关系的情况下:

  • 需要维护模型类中的关联关系名
  • 在设置外键关联的模型类中,通过related_name 指定关联关系名
  • 在反向序列化器中,通过source='关联关系名',指定对应关联模型

1.多对多关系模型 的嵌套关系(正向)

接上文中的 Teacher-Student 案例 ,演示 多对多的嵌套

在 teacherSerializer.py 中引入学生序列化器 StudentSerializer

# teacherSerializer.py
from rest_framework import serializers
from app.models import TeacherModel
from app.serializer.studentSerializer import StudentSerializer
# PS:注意不要循环嵌套(即教师序列化器中引入学生序列化器,又在学生序列化器中引入教师序列化器)

class TeacherSerializer(serializers.ModelSerializer):
    # student = serializers.SlugRelatedField(slug_field='name', many=True, read_only=True)
    
    # 嵌套 学生序列化器--StudentSerializer
    student = StudentSerializer(many=True, read_only=True) #对应TeacherModel中的student字段
    
    class Meta:
        model = TeacherModel
        fields = '__all__'

在 teacherSerializer.py 中引入学生序列化器 StudentSerializer后,查询 Teacher 信息,效果图如下:
在这里插入图片描述

PS:注意不要循环嵌套序列化器

循环嵌套的实例代码如下:
(这样写会报错,此处仅用来演示循环嵌套这种错误操作)

# TeacherSerializer.py
from rest_framework import serializers
from app.models import TeacherModel
# 演示 循环嵌套(循环引入、循环导包) 
from app.serializer.studentSerializer import StudentSerializer

class TeacherSerializer(serializers.ModelSerializer):
    # 嵌套序列化器
    student = StudentSerializer(many=True, read_only=True) #对应TeacherModel中的student字段
    
    class Meta:
        model = TeacherModel
        fields = '__all__'

#--------------华丽的分割线----------------------------
# StudentSerializer.py 
from rest_framework import serializers
from app.models import StudentModel

from app.serializer.classSerializer import ClassSerializer
# 注意循环嵌套 teacherSerializer 与 studentSerializer
from app.serializer.teacherSerializer import TeacherSerializer

class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    
    class Meta:
        model = StudentModel
        fields = '__all__'

2.一对多关系模型 的嵌套关系(正向)

一对多关系模型 : 班级cla与学生student关系模型

studentSerializer.py:

# studentSerializer.py
from rest_framework import serializers
from app.models import StudentModel

from app.serializer.classSerializer import ClassSerializer

class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    
    # 自定义字段
    gender = serializers.SerializerMethodField(read_only=True)
    def get_gender(self,obj):
        return obj.get_gender_display()

    # 自定义字段
    xxxx = serializers.SerializerMethodField()
    def get_xxxx(self, obj): #obj-当前学生对象
        return obj.cla.name # 多对多不行(要用.all()),

    # +嵌套关系 多对一 student --- cla
    cla = ClassSerializer()

    class Meta:
        model = StudentModel
        fields = '__all__'

student-cla多对一,嵌套关系下(StudentSerializer嵌套ClassSerializer)查询students,效果图如下:
在这里插入图片描述


3. 多对多关系模型 的嵌套关系(反向)

多对多关系模型:学生student与教师teacher关系模型

反向嵌套关系的情况下:

  • 需要维护模型类中的关联关系名
  • 在设置外键关联的模型类中,通过related_name 指定关联关系名
  • 在反向序列化器中,通过source='关联关系名',指定对应关联模型


在如下代码中会有所体现:

  • studentSerializer 序列化器中引入的TeacherSerializer中通过source='关联关系名',指定对应关联模型。
    teacherModel 模型类中,设置student外键时通过related_name 指定关联关系名。
    • studentSerializer序列化器中:teac = TeacherSerializer(many=True, read_only=True,source='tea')
    • TeacherModel模型类中:student = models.ManyToManyField(to=StudentModel,related_name='tea')

studentSerializer.py:

# studentSerializer.py
from rest_framework import serializers
from app.models import StudentModel

from app.serializer.classSerializer import ClassSerializer
from app.serializer.teacherSerializer import TeacherSerializer
class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    
    # 自定义字段
    gender = serializers.SerializerMethodField(read_only=True)
    def get_gender(self,obj):
        return obj.get_gender_display()

    # 自定义字段
    xxxx = serializers.SerializerMethodField()
    def get_xxxx(self, obj): #obj-当前学生对象
        return obj.cla.name # 多对多不行(要用.all())

    # 嵌套关系 多对一 student --- cla
    # cla = ClassSerializer()

    # 学生stu-老师teac 多对多关系模型--反向查询
    # teachermodel_set.all()
    
    #不在 model设置 related_name时,默认source='teachermodel_set'
    # teac = TeacherSerializer(many=True, read_only=True,source='teachermodel_set') 
    teac = TeacherSerializer(many=True, read_only=True,source='tea')
    class Meta:
        model = StudentModel
        fields = '__all__'

models.py:

# models.py
#教师模型类
class TeacherModel(models.Model):
    GENDER_CHOICES = {
        (1, '男'),
        (2, '女'),
        (3, '保密'),
    }
    name = models.CharField(max_length=50)
    age = models.IntegerField(max_length=18)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)
    info = models.CharField(max_length=100, null=True)
    student = models.ManyToManyField(to=StudentModel,related_name='tea')

    def __str__(self):
        return self.name
    class Meta:
        db_table = 'teacher'

多对多关系模型(students-teachers)下,students反向查询teachers,效果图如下:
在这里插入图片描述


二、关联序列化器反序列化

1. 默认关联反序列化方式(简单情况下)

postman或其他手段进行测试时,在老师,学生关系模型中,想要添加学生信息,直接传老师 id学生名、及其他所需字段即可

学生反序列化器不需要写任何字段,默认的关联字段会接受一个id数据作为校验依据并创建
以学生为例:

studentSerializer.py,studentView.py:

# studentSerializer.py
class StudentSer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'
#-----------------------------------------------
# studentView.py
class studentView(APIView):
    def post(self, request):
        ser = StudentSer(data=request.data)
        if ser.is_valid():
            ser.save()
        error = ser.errors
        return Response({'msg': erro r if error else 'success'})

postman 测试时,只需要传如下数据即可:

 {
    "teacher": "2", # 外键直接传入 id 即可
    "name": "小黑"
	}

2. 多对多关联模型反序列化方式

PS:此案例仅用来复习上述知识

学生student–教师teacher 多对多关联模型

models.py -----模型类中-----定义 StudentModel 和 TeacherModel

# models.py
#学生模型类
class StudentModel(models.Model):
    GENDER_CHOICES = {
        (1, '男'),
        (2, '女'),
        (3, '保密'),
    }
    name = models.CharField(max_length=50)
    age = models.IntegerField(max_length=18)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)
    info = models.CharField(max_length=100, null=True)
    cla = models.ForeignKey(to=ClassModel, on_delete=models.SET_NULL, null=True)
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'student'

#教师模型类
class TeacherModel(models.Model):
    GENDER_CHOICES = {
        (1, '男'),
        (2, '女'),
        (3, '保密'),
    }
    name = models.CharField(max_length=50)
    age = models.IntegerField(max_length=18)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)
    info = models.CharField(max_length=100, null=True)
    # 不设置反向关系时
    student = models.ManyToManyField(to=StudentModel)
    # 设置反向关系时
    #student = models.ManyToManyField(to=StudentModel,related_name='tea')

    def __str__(self):
        return self.name
    class Meta:
        db_table = 'teacher'

序列化器 ---- 定义 StudentSerializer 和 TeacherSerializer

# studentSerializer.py
from rest_framework import serializers
from app.models import StudentModel

from app.serializer.teacherSerializer import TeacherSerializer

class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, min_length=2, error_messages={"min_length": "姓名不能少于两个字符"})
    info = serializers.CharField(max_length=100)
    
    # 自定义字段
    gender = serializers.SerializerMethodField(read_only=True)
    def get_gender(self,obj):
        return obj.get_gender_display()

    # 自定义字段
    xxxx = serializers.SerializerMethodField()
    def get_xxxx(self, obj): #obj-当前学生对象
        return obj.cla.name # 多对多不行
    
    #模型类没有设置反向关系时:
    teac = TeacherSerializer(many=True, read_only=True) #不在model设置related_name时,默认source='teachermodel_set'
    
    # 模型类中设置反向关系后:
    # teac = TeacherSerializer(many=True, read_only=True,source='tea')
    # teac = TeacherSerializer(many=True,source='tea')


    class Meta:
        model = StudentModel
        fields = '__all__'

#-----------------------------------------------
# teacherSerializer.py
from rest_framework import serializers
from app.models import TeacherModel

class TeacherSerializer(serializers.ModelSerializer):

    class Meta:
        model = TeacherModel
        fields = '__all__'

视图类:views_stu:

# views_stu.py
# 测试多对多关系模型反序列化,利用反向查询,添加老师(创建新老师)(post方式 提交教师信息),
class StudentTeacherViews(APIView):
    def get(self, request):
        return Response({"message":"GET测试成功!"})

    # post
    def post(self, request):
        teac = TeacherSerializer(data=request.data)
        if teac.is_valid():
            teac.save()
            print(teac.data)
            # {'id': 4, 'name': '照老师', 'age': 18, 'gender': 2, 'info': '她是敬业负责的一个老师', 'student': [1]}
            stu = StudentModel.objects.get(pk=teac.data["student"][0])
            print(stu)
            # stu.tea.add(teac.data["id"]) # model和Serializer显式设置了反向关系时
            stu.teachermodel_set.add(teac.data["id"]) # 默认情况下
            return Response({"message":"添加成功!"}) 
        else:
            return Response({"message": teac.errors})


路由:urls.py:


from django.urls import path
from app.views_stu import StudentViews,StudentTeacherViews
from app.views_teacher import TeacherViews

urlpatterns = [
    path('students/', StudentViews.as_view()),
    path('teachers/', TeacherViews.as_view()),

    path('studentstest/', StudentTeacherViews.as_view()),

]


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱,这在全球范围内得到广泛认同,为了让入伍的新兵能快速熟悉和掌握武器装备操作流程,基于创新型的华锐3D云展平台工具,搭建的3D军事武器展示搭建编辑器,让部队的军事武器展示…

Golang——gRPC gateway网关

前言 etcd3 API全面升级为gRPC后,同时要提供REST API服务,维护两个版本的服务显然不大合理,所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务,HTTP服务接收客户端请求后转换为gr…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层,用于简化JDBC开发 1步中的实体类 int类型一般用Integer :如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

Elasticsearch 认证模拟题 - 21

一、题目 写一个查询,要求查询 kibana_sample_data_ecommerce 索引,且 day_of_week、customer_gender、currency、type 这 4 个字段中至少两个以上。 1.1 考点 Boolean 1.2 答案 GET kibana_sample_data_ecommerce/_search {"query": {&q…

C-冒泡排序的循环条件应该怎么写

目录 一、冒泡排序的原理 二、代码实现 三、代码解读 1. 第一层循环条件怎么来的 2.第二层循环条件怎么来的 四、优化代码 我发现,好像还是有一部分同志,没有很清楚冒泡排序的两层循环条件为什么这么写? 感到有些模糊,但又可…

光照药物稳定性试验箱百科

概念与作用 - 药品稳定性试验箱:一种精密设备,用于模拟药品在不同环境条件下的存储情况。 - 环境模拟:通过控制温度、湿度等参数,复制各种实际储存条件,以测试药品稳定性。 - 保障药品质量:通过试验&…

Mybatis做批量操作

动态标签foreach,做过批量操作,但是foreach只能处理记录数不多的批量操作,数据量大了后,先不说效率,能不能成功操作都是问题,所以这里讲一讲Mybatis正确的批量操作方法: 在获取opensession对象…

conda安装pytorch使用清华源

原命令,例: # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch使用清华源,例: # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatool…

Win11 问题集

文章目录 一、Win11 选择其他应用打开无反应1、新建 1.reg 文件2、新建 2.reg 文件3、运行 reg 文件 二、Win11 账户怎么改名 一、Win11 选择其他应用打开无反应 Win11选择打开方式卡死怎么办? 选择打开方式没有反应的解决办法 1、新建 1.reg 文件 1.reg Windows Registry…

技术转管理,是灾难还是奇迹?

深耕技术or转战管理?this is a question! 如果你还没有想好,那请继续往下看! 技术专家:技术前瞻者、方案构建者、难题破解者、团队聚核者 管理专家:战略规划者、高效组织者、变革引领者、团队建设者 特点和重心都不在…

RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多

RN6752V1描述: RN6752V1是一种模拟高清晰度(模拟高清)视频解码器IC,专为汽车应用而设计。它集成了所有必要的功能块: AFE,PLL,解码逻辑,MIPI和I2C接口等,在一个小的5mm …

三、网络服务协议

目录 一、FTP:文件传输协议 二、Telnet:远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP:文件传输协议 C/S架构,现多用于企业内部的资料共享和网络设备的文件传输,企业内部搭建一…

windows10或者windows11怎么查看自己电脑显卡型号

win10系统: 右键单击任务栏后弹出菜单选择任务管理器 打开任务管理器后,点击性能查看左侧GPU0或者GPU1 如果有nvidia字样表示自己电脑有nvidia显卡,如果是AMD或者intel字样表示没有nvidia显卡。注意如果你有GPU0或者GPU1说明你电脑是双显卡&…

2.2 利用MyBatis实现CRUD操作

MyBatis 是一个半自动的持久层框架,它简化了数据库操作,允许开发者通过 XML 或注解的方式来配置 SQL 语句,实现数据的增删改查(CRUD)操作。 1. 环境搭建 引入依赖:在项目中添加 MyBatis 以及数据库驱动的…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx(最小)配置详解 六、Nginx(基础)配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

大数据实训项目(小麦种子)-01、VirtualBox安装与Centos7系统安装

文章目录 前言项目介绍项目任务目标一、VirtualBox安装1.1、认识VirtualBox1.2、VirtualBox的下载安装 二、VirtualBox安装Centos7系统2.1、VirtualBox安装Centos72.2、Centos7配置静态IP地址2.3、Centos7环境基础配置 三、Windows安装FinalShell及连接Centos73.1、FinalShell下…

QT打包(windows linux)封包 完整图文版

目录 简介: 一. for windows 1.首先下载组件 2.开始构建Release版本. 3.然后点击构建 4.在文件夹内直接点击exe文件,会报下面的错误,因为缺少dll连接; 5.需要把这个exe单独复制到一个文件夹内, 6.先cd到单独exe所在的文件夹; cd 文件路径 7.然后运行 windeployqt 文…

快速数据处理:软件功能简介及下载

目录 1 功能介绍 1.1 封面 1.2 可定制功能 1.3 支持的操作系统和CPU 1.4 数据上报 1.5 数据接收 1.5 附带的测试数据 1.6 关于内置python的说明 2 软件下载 3 待开发功能 发布这个程序的原因是,前面写的这个专题的几篇文章,我原以为一点用也没…

【SpringBoot】SpringBoot:简化数据库操作与API开发

文章目录 引言SpringBoot概述数据库操作简化传统数据库操作的挑战使用Spring Data JPA示例:定义Repository接口实现服务层 使用MyBatis示例:配置MyBatis定义Mapper接口 API开发简化RESTful API概述创建RESTful API示例:定义控制器 高级特性与…

GDB:从零开始入门GDB

目录 1.前言 2.开启项目报错 3.GDB的进入和退出 4.GDB调试中查看代码和切换文件 5.GDB调试中程序的启动和main函数传参 6.GDB中断点相关的操作 7.GDB中的调试输出指令 8.GDB中自动输出值指令 9.GDB中的调试指令 前言 在日常开发中,调试是我们必不可少的技能。在专业…