django-rest-framework-01

概念,restful风格

  • 为什么要用restful风格的组件进行开发?

    主要作用是前后端分离,可以让前端和后端同时进行开发,使用restful一开始只写接口,而不写视图函数,这些接口就是通过restful风格的路由,配合请求方式来对数据库进行增删改查操作,同一个路由不同的请求方式代表了不同的操作。

django-rest-framework框架基本开发流程?

  • 1.在settings中配置framework模块。

  • 2.编写serializers.py文件,对当前模块的所有表编写序列类以支持增删改操作,如果需要进行查询,则还要对表编写过滤类。如果表之间存在关联,则需要在类中调用其他表的序列类创建一个实例。

  • 3.二级路由文件中用router对象注册接口路径,urlpatterns列表中引入router.urls来让这些接口生效。

  • 4.编写ViewSet类,非常像视图,这个类创建之前编写的serializer实例,以及指定queryset等关键属性,就可以对对应的表进行增删改查,如果有一些特殊的操作,可以重写其中的六种方法。

    list 对应查询操作 GET

    create 对应增加记录 POST

    update 更新 PUT

    partial_update 局部字段更新 PATCH

    destroy 删除 DELETE

  • 5.这些接口的请求路径就是一级路由拼接router.register(',,,url', views.xxViewSet)这个当中的第一个url参数。

  • 备注

总结一下 django restframework 的设计思路。

  1. 设计 serializer

    编写serializers.py文件,对每一个表进行序列化,过滤类的编写。

  2. 得到 queryset

    编写视图的时候,继承viewset,指定queryset,过滤,序列类。

  3. 序列化后返回

    创建序列对象,传入queryset和请求,对数据库进行查询,返回响应。

或者

  1. 设计 serializer

    同样编写每个表的过滤,序列类

  2. 从 request 中获取数据

    编写视图,继承viewset,指定queryset,serializer_class关键变量,对数据库进行增删改查等操作

  3. 反序列化后保存

    满足一定条件则进行serializer.save(),对数据库做出持续性的更改,不满足则返回响应提示错误信息。

环境依赖

  • requirement.txt 包含需要的模块
  • 使用时进入项目,控制台执行pip install -r requirement.txt

入门笔记

  • 1.编写序列类

    在模块下新建serializers.py文件,编写如下代码

    # 导入我们的模型
    from demo.models import Type, User
    from rest_framework import serializers
    # 导入filter_set
    from django_filters.filterset import FilterSet
    
    # 序列器,每个model都要写,指定模型类和字段
    class TypeSerializers(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Type
            fields = '__all__'
            # __all__代表所有字段,如需指定部分字段,可用以下方式
            # fields = ('字段一', '字段二', '...')
    
    class UserSerializers(serializers.HyperlinkedModelSerializer):
        # 在models中存在外键关系,此处需要用type来接收
        type = TypeSerializers()
        class Meta:
            model = User
            fields = '__all__'
    # 当需要查询操作时,需要重写filter类,继承FilterSet类
    # 同样是重写Meta中model和fields
    class UserFilter(FilterSet):
        class Meta:
            model = User
            fields = '__all__'
    
  • 2.接口编写(可以写在视图文件里面,但是个人感觉单独来写,视图调用时在进行导入更好

    views.py文件编写接口类,视图函数

    # 导入django的json响应类
    from django.http import JsonResponse
    # 导入我们自己写的序列器
    from .serializers import UserFilter, UserSerializers, TypeSerializers
    # 导入模型中的类
    from demo.models import User, Type
    # 导入viewsets
    from rest_framework import viewsets
    # 导入FilterBackend
    from django_filters.rest_framework import DjangoFilterBackend
    import json
    # 导入django中处理用户密码的两个函数
    from django.contrib.auth.hashers import make_password, check_password
    # Create your views here.
    
    '''
    视图类,继承viewsets.ModelViewSet
    '''
    class TypeViewSet(viewsets.ModelViewSet):
      queryset = Type.objects.all()
      serializer_class = TypeSerializers
    
      filter_backends = (DjangoFilterBackend,)
    
    class IndexViewSet(viewsets.ModelViewSet):
        # 几个关键变量
        queryset = User.objects.all() # 要查询的querset
        serializer_class = UserSerializers # 表序列器
    
        filter_class = UserFilter # 过滤器
        filter_backends = (DjangoFilterBackend,) # 过滤系统,可以传入多个
        # 增加记录
        def create(self, request, *args, **kwargs):
            ret_msg = {'status': 2000, 'msg': None} # 返回信息字典
            name = request.data.copy().get('name', '')
            if name == '':
                print(name)
                ret_msg['msg'] = '名字不能为空!'
                return JsonResponse(ret_msg)
            # 创建序列器实例,传入data,context参数
            data = {
                'name', name,
                'type', 0
            }
            serializer = UserSerializers(data=data, context={'request': request})
            # 判断序列器状态,做出对应响应
            if  not serializer.is_valid():
                ret_msg['status'] = 2001
                ret_msg['msg'] = serializer.errors
                return JsonResponse(ret_msg)
            if ret_msg['msg'] is None:
                ret_msg['msg'] = '成功!'
            # 序列器保存执行命令
            serializer.save()
            return JsonResponse(ret_msg)
    
  • 3.路由配置

    路由文件编写如下形式

    from django.urls import path,include
    # 导入routers包
    from rest_framework import routers
    from .views import IndexViewSet, TypeViewSet
    
    # 实例一个router
    router = routers.DefaultRouter()
    # 注册表
    router.register(r'type', viewset=TypeViewSet, base_name='type')
    router.register(r'user', viewset=IndexViewSet, base_name='user')
    
    urlpatterns = [
        path('^', include(router.urls))
    ]
    
  • 4.其他配置

    settings.py文件

    # restframework 配置
    REST_FRAMEWORK = {
        # Use Django's standard `django.contrib.auth` permissions,
        # or allow read-only access for unauthenticated users.
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
        ]
    }
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'rest_framework',
        'demo',
    ]
    

评论 2