知识点
1.默认外键序列化,使用外键的主键字段。
2.StringRelated外键序列化,使用外键表的 str方法进行序列化。
3.SlugRelated外键序列化,指定字段进行序列化。
4.PrimaryKeyRelatedField外键序列化,使用外键表的主键进行序列化。
5.外键自定义序列化方式,使用自定义方法进行序列化。
# 只能进行序列化,只能查询
class StudentSerializer2(serializers.ModelSerializer):
# 1.使用外键表的 str方法进行序列化。
# teacher = serializers.StringRelatedField()
# 2.指定字段进行序列化。
# teacher = serializers.SlugRelatedField(read_only=True, slug_field='tea_name')
# 3.使用外键表的主键进行序列化。
# teacher = serializers.PrimaryKeyRelatedField(read_only=True)
# 4.使用自定义方法进行序列化,字段自定义(名字自己起)
tea_name = serializers.SerializerMethodField(read_only=True)
# 函数名以get_开头,再加上自定义字段名; obj就是模型类对象
def get_tea_name(self, obj):
return obj.teacher.tea_name
class Meta:
model = Student
fields = '__all__'
问题:
要对子表学生表实现增删查改操作,并且要求展示外键的时候展示的是老师姓名,需要自己编写几个序列化器?
跟子表学生表相关的序列化器需要2个。
1.创建django项目和应用
创建项目:django-admin startproject 项目名
创建子应用: python .\manage.py startapp 应用名
2.项目配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # drf框架
'corsheaders', # 跨域
'student', # 子应用
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware', # 跨域中间件
]
CORS_ORIGIN_ALLOW_ALL = True # 跨域 允许所有源访问
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'root',
'NAME': 'student',
}
}
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
3.安装数据库
进入与项目同名的 init.py文件
import pymysql
pymysql.install_as_MySQLdb()
4.编写模型类
from django.db import models
# Create your models here.
class Teacher(models.Model):
tea_name = models.CharField(max_length=20, verbose_name='老师姓名')
class Meta:
verbose_name = '老师表'
verbose_name_plural = verbose_name
db_table = 'teacher'
def __str__(self):
return self.tea_name
class Student(models.Model):
stu_name = models.CharField(max_length=20, verbose_name='学生姓名')
score = models.IntegerField(verbose_name='成绩')
sex = models.CharField(max_length=5, verbose_name='性别')
teacher = models.ForeignKey(to=Teacher, on_delete=models.CASCADE, verbose_name='老师')
class Meta:
verbose_name = '学生表'
verbose_name_plural = verbose_name
db_table = 'student'
def __str__(self):
return self.stu_name
5.迁移
生成迁移文件:python .\manage.py makemigrations
执行迁移:python .\manage.py migrate
6.创建超级用户并添加测试数据
创建超级用户:python .\manage.py createsuperuser
注册模型类:
from django.contrib import admin
from student.models import Teacher, Student
# Register your models here.
admin.site.register(Teacher)
admin.site.register(Student)
运行项目并添加测试数据
7.路由分发
在子应用下创建urls.py文件
# 子路由
from django.urls import path
urlpatterns = [
]
在与项目同名的文件夹下的 urls.py文件
# 主路由
from django.contrib import admin
from django.urls import path, include
from student import urls
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(urls)),
]
8.序列化器
在子应用下新建文件serializers.py文件,添加以下代码:
class TeacherSerializer(serializers.ModelSerializer):
class Meta:
model = Teacher
fields = '__all__'
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = '__all__'
9.视图
from rest_framework.views import APIView
from rest_framework.response import Response
from student.models import Teacher, Student
from student.serializers import TeacherSerializer, StudentSerializer
# Create your views here.
class StudentsView(APIView):
# 查询所有学生信息
def get(self,request):
students = Student.objects.all() # 获取数据
ser = StudentSerializer(instance=students, many=True) # 序列化
return Response(ser.data, status=200)
10.配置路由
在子应用下创建urls.py文件
# 子路由
from django.urls import path
urlpatterns = [
]