+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-04(14)

2020-05(26)

2020-06(40)

2020-07(35)

2020-08(46)

使用Django REST framework开发RESTful API接口2

发布于2021-04-03 16:01     阅读(1043)     评论(0)     点赞(20)     收藏(2)


0

1

2

3

4

序列化

把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')

函数式编程FBV

获取课程列表

打开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的课程,重新获取一下课程列表进行验证
在这里插入图片描述
成功。

原文链接:https://blog.csdn.net/TLuffy/article/details/115371970

0

1

2

3

4

5

6

7

8

9



所属网站分类: 技术文章 > 博客

作者:哇哇

链接: https://www.pythonheidong.com/blog/article/914919/0689bf5f38cad8647d2d/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)