序列化
把Django数据类型转化为json/xml,方便前端渲染。
在course应用下新建serializers.py
文件
from django import forms
from django.contrib.auth.models import User
from rest_framework import serializers
from .models import Course
# class CourseForm(forms.ModelForm):
# class Meta:
# model = Course
# fields = ('name', 'introduction', 'teacher', 'price')
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class CourseSerializer(serializers.ModelSerializer):
teacher = serializers.ReadOnlyField(source='teacher.username') # 外键字段 只读
class Meta:
model = Course # 写法和上面的CourseForm类似
fields = '__all__'
depth = 2
# class CourseSerializer(serializers.HyperlinkedModelSerializer):
# teacher = serializers.ReadOnlyField(source='teacher.username')
#
# class Meta:
# model = Course
# # url是默认值,可在settings.py中设置URL_FIELD_NAME使全局生效
# fields = ('id', 'url', 'name', 'introduction', 'teacher', 'price', 'created_at', 'updated_at')
函数式编程 Function Based View
获取课程列表
打开views.py
from rest_framework.decorators import api_view
from course.models import Course
from course.serializers import CourseSerializer
from rest_framework.response import Response
from rest_framework import status
""" 函数式编程 Function Based View
@api_view 装饰器
"""
@api_view(["GET", "POST"])
def course_list(request):
"""
获取所有课程信息或新增一个课程
:param request:
:return:
"""
if request.method == 'GET':
# 序列化多个对象 many=True
s = CourseSerializer(instance=Course.objects.all(), many=True)
return Response(data=s.data, status=status.HTTP_200_OK)
elif request.method == 'POST':
# 反序列化
s = CourseSerializer(data=request.data) # 部分更新用partial=True属性
# 反序列化需要校验
if s.is_valid():
# 设置当前用户
s.save(teacher=request.user)
return Response(data=s.data, status=status.HTTP_201_CREATED)
return Response(s.errors, status=status.HTTP_400_BAD_REQUEST)
添加路由验证。
在course应用下新建urls.py
文件。
from django.urls import path, include
from course import views
urlpatterns = [
# FBV
path("fbv/list", views.course_list, name="fbv-list"),
]
打开项目路由文件urls.py
,添加path('course/', include('course.urls'))
。
运行进行验证。
由于在项目settings.py
配置了全局登陆校验。
当你出现登陆框的时候输入你注册的超级用户账号密码即可。
出现上图表示登陆成功,可以点手动添加一个对象,点击POST进行校验接口。
获取、更新、删除单个课程
继续在course_list函数下面新建course_details函数。
@api_view(["GET", "PUT", "DELETE"])
def course_details(request, pk):
"""
获取、更新、删除一个课程
:param request:
:param pk: primary key 主键的意思
:return:
"""
try:
# 因为可能查询不到,所以加上 try
course = Course.objects.get(pk=pk)
except Course.DoesNotExist:
return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND)
else:
if request.method == "GET":
s = CourseSerializer(instance=course)
return Response(data=s.data, status=status.HTTP_200_OK)
if request.method == "PUT":
# instance序列化查询到的对象
# data 获取前端传来的数据
s = CourseSerializer(instance=course, data=request.data)
if s.is_valid():
# 因为这是修改,teacher已经存在了,所以直接保存
s.save()
return Response(data=s.data, status=status.HTTP_200_OK)
return Response(data=s.errors, status=status.HTTP_400_BAD_REQUEST)
if request.method == "DELETE":
course.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
打开course应用添加路由
urlpatterns = [
# FBV
path('fbv/list', views.course_list, name="fbv-list"), # name 表示网页返回显示的路由地址
path('fbv/details/<int:pk>', views.course_details, name="fbv-details")
]
运行查看结果。
多添加几条数据用来测试。
打开接口测试工具Postman
,没有的自行百度安装。
获取单个课程
如果提示身份认证信息未提供。
根据下面图片步骤进行配置
获取id=2
的课程信息
更新单个课程
可以看到teacher字段也写上了,但是未更新,那是因为前面在模型里面设置的是只读
的。
删除一个课程
可以看到我们删除的是id=1
的课程,重新获取一下课程列表进行验证
成功。