drf组件中,为我们提供了两个序列化类
- Serializer
- ModelSerializer
1.Serializer
2.ModelSerializer
- 跟ModelForm一样,可以通过model参数来获取某一个数据模型的类(就是数据库的表名)
下面以ModelSerializer做一个代码示例
1.models.py文件代码示例
from django.db import models
class UserInfo(models.Model):
'''用户表'''
username = models.CharField(max_length=16,verbose_name="用户名")
password = models.CharField(max_length=32,verbose_name="密码")
email = models.CharField(max_length=32,verbose_name="邮箱")
sex_choices = ((1,"男"),(2,"女"))
sex = models.IntegerField(verbose_name='性别',choices=sex_choices)
roles = models.ManyToManyField(verbose_name="角色",to="Role")
depart = models.ForeignKey(verbose_name="部门",to="Depart",on_delete=models.CASCADE,null=True,blank=True)
def __str__(self):
return self.username
class Meta:
db_table = "db_userinfo"
class Role(models.Model):
'''角色表'''
name = models.CharField(max_length=16,verbose_name="角色名称")
def __str__(self):
return self.name
class Meta:
db_table = "db_role"
class Depart(models.Model):
'''部门表'''
title = models.CharField(max_length=16,verbose_name="部门名称")
def __str__(self):
return self.title
class Meta:
db_table = "db_depart"
2.序列化类的定义,serializers.py代码示例:
from rest_framework import serializers
from django.forms.models import model_to_dict
from student import models
class UserSerializer(serializers.ModelSerializer):
sex_text = serializers.CharField(source="get_sex_display")
depart = serializers.CharField()
roles = serializers.SerializerMethodField()
class Meta:
model = models.UserInfo
fields = ["username","password",'email',"sex_text","roles","depart"]
extra_kwargs= {
"depart":{"source":"depart.title"},
}
def get_roles(self,obj):
role_list = obj.roles.all()
return [model_to_dict(role,["id","name"]) for role in role_list]
3.视图函数views.py代码示例:
from rest_framework.views import APIView
from rest_framework.response import Response
from student.models import UserInfo
from student.serializers import UserSerializer
class UserViewSet(APIView):
def get(self,request):
queryset = UserInfo.objects.all()
ser = UserSerializer(instance=queryset,many=True)
return Response(ser.data)
最后,访问设置好的api路径接口,会返回设置好的数据,如图:

关于多表的序列类嵌套
- 因为多张表存在,也可以每张表定义一个序列化类,进行多个序列化类的嵌套
示例代码:
class RolesSerializer(serializers.ModelSerializer):
'''角色表序列化类'''
class Meta:
model = models.Role
fields = "__all__"
class DepartSerializer(serializers.ModelSerializer):
'''部门表序列化类'''
class Meta:
model = models.Depart
fields = ["title"]
class UserSerializer(serializers.ModelSerializer):
'''用户表序列化类'''
sex_text = serializers.CharField(source="get_sex_display")
depart = DepartSerializer()
roles = RolesSerializer(many=True)
class Meta:
model = models.UserInfo
fields = ["username","password",'email',"sex_text","roles","depart"]
序列化类嵌套的方式,接口返回的数据也是差不多的,如图:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」