美文网首页
Python(六十一)Django Rest Framework

Python(六十一)Django Rest Framework

作者: Lonelyroots | 来源:发表于2022-02-07 22:47 被阅读0次

1.项目知识小科普:

线上仓库如果有更新,先拉取到本地仓库,然后通过以下步骤重新推送。

  1. git pull:先从线上仓库拉取数据到本地仓库。
  2. 修改
  3. git add:将文件提交到暂存区
  4. git commit:将文件从暂存区提交到本地仓库
  5. git push:从本地仓库推送到远程线上仓库

    因为映射文件后,手快没有提交映射文件,导致出了点问题,所以我重新建了一个远程仓库,克隆下来后文件夹名是仓库名。

    克隆了以后会出现一个Ls_shopping_center,再新建一个django项目,则总共有三个Ls_shopping_center的文件夹。

    pycharm部署路径时选择两个文件的下方

    删除掉旧的数据库(俗称删库跑路)

    新建一个数据库ls_shopping_center(俗称从头再来)

2. 模型类生成表

apps/school/models.py:

# (三、验证码实现;四、短信验证码)

from django.db import models

# Create your models here.
class Student(models.Model):
    SEX_CHOICES = (
        (0,'女'),
        (1,'男')
    )        # 大写的变量代表常量,变量名是不可变的.
    name = models.CharField(max_length=30,verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄',null=True,blank=True)      # null=True:允许为空,blank=True:表示代码中创建数据库记录时该字段可传空白(空串,空字符串).
    sex = models.IntegerField(verbose_name='性别',null=True,blank=True,choices=SEX_CHOICES)
    create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    is_delete = models.BooleanField(default=False,verbose_name='逻辑删除')
    classes = models.ForeignKey('Classes',on_delete=models.CASCADE)

    # 将映射的表名修改为student.
    class Meta:
        db_table = 'student'

    # 将模型类的delete方法重写
    def delete(self, using=None, keep_parents=False):
        self.is_delete = True       # 逻辑删除,正常情况下已经删除,但在数据库中仍然有显示
        self.save()

class Classes(models.Model):
    name = models.CharField(max_length=30,verbose_name='班级名',help_text='班级名')
    slogan = models.TextField(verbose_name='口号',null=True,blank=True)
    create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
    is_delete = models.BooleanField(default=False,verbose_name='逻辑删除')

    class Meta:
        db_table = 'classes'

    # 将模型类的delete方法重写
    def delete(self, using=None, keep_parents=False):
        self.is_delete = True       # 逻辑删除,正常情况下已经删除,但在数据库中仍然有显示
        self.save()

    def __str__(self):
        return self.name        # 返回班级名

3. 序列化器:

apps/school/serializers.py:

# (三、验证码实现;四、短信验证码)

"""
    序列化器:
        本质就是一个类,和模型类差不多的类,
        用于json格式与模型对象进行互转以及校验数据。

    更简便且高效的写法
        通过ModelSerializer(继承的是Serializer)
"""
from rest_framework import serializers
from rest_framework.relations import StringRelatedField
from school.models import Student     # 导入models文件中的Student类
from school.models import Classes     # 导入models文件中的Classes类

class StudentSerializer(serializers.ModelSerializer):
    # classes = StringRelatedField(read_only=True)        # 学生表可以显示班级,但是只读

    class Meta:
        model = Student     # 指定序列化器映射的模型类。
        fields = '__all__'      # fields指定映射字段,__all__表示所有字段
        # fields = ['id','name','age']    # 只映射id、name、age三个字段
        # exclude = ['id']        # 映射除id字段之外的所有字段。
        extra_kwargs = {
            'age':{'min_value':0,'max_value':200},
        }       # 对字段的规则进行修改

    # 追加额外的校验逻辑,自定义校验规则
    def validate_name(self,value):
        if 'python' not in value.lower():
            raise serializers.ValidationError('name error')
        return value

    # # 对象级别的额外验证
    # def validate(self,data):
    #     if 'python' not in data['name'].lower():
    #         raise serializers.ValidationError('name error')
    #     return data


class ClassesSerializer(serializers.ModelSerializer):
    # 一对多关联序列化
    student_set = StudentSerializer(many=True)      # 反向查询,student_set返回的是模型集,需要通过学生序列化器转JSON格式

    class Meta:
        model = Classes
        fields = '__all__'

    def validate_name(self,value):
        if '班' not in value:
            raise serializers.ValidationError('班级名需要带有班')
        return value

4. 视图函数

apps/school/views.py:

# (四、短信验证码)

# 增删改查操作都可以通过这种方式执行
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from .models import Student,Classes
from .serializers import StudentSerializer
from .serializers import ClassesSerializer

class StudentViewSet(ModelViewSet):     # ModelViewSet继承于五个mixins
    """
    list:
        返回学生列表数据

    """
    # queryset = Student.objects.all()
    queryset = Student.objects.filter(is_delete=False,classes__is_delete=False)      # 查询集中只有逻辑未删除的数据,网页上不显示,但数据库中仍然保留
    serializer_class = StudentSerializer

# # 单单只想要查询操作,不过这种方式路由需要做出对应的修改.
# from rest_framework.mixins import ListModelMixin
# from rest_framework.viewsets import GenericViewSet
# from .models import Student
# from .serializers import StudentSerializer
#
# class StudentViewSet(ListModelMixin,GenericViewSet):
#     queryset = Student.objects.all()
#     serializer_class = StudentSerializer

class ClassesViewSet(ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = ClassesSerializer

    @action(methods=['get'],detail=False)       # 因为路由使用的是路由器,所以需要定义下方路由的请求方式,detail为是否需要传递id
    def last(self,request):
        classes = Classes.objects.last()
        classes = Classes.objects.filter(is_delete=False).last()
        serializer = self.get_serializer(classes)       # 拿到指定的序列化器
        return Response(serializer.data)

5. 路由器

apps/school/urls.py:

# (四、短信验证码)

"""路由器"""
# 只有当视图函数里的StudentViewSet继承于ViewSet及其ViewSet的子类才可以使用路由器.
from rest_framework.routers import SimpleRouter
from .views import StudentViewSet,ClassesViewSet

urlpatterns = [

]

router = SimpleRouter()      # 创建路由器
router.register('students',StudentViewSet)      # 注册学生的路由
router.register('classes',ClassesViewSet)      # 注册班级的路由
urlpatterns += router.urls      # 拼接获取生成的路由列表

6. 限流

限流的配置,可以直接从官网上爬取源码
https://www.django-rest-framework.org/api-guide/throttling/

# (四、短信验证码:限流、接口文档)
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',       # 没有登录的匿名用户
        'rest_framework.throttling.UserRateThrottle'        # 登录的用户
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',      # 访问频次,单位可以是hour、minute、second
        'user': '1000/day'      # 访问频次
    },
    'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema'
}

7. 生成官方的接口文档

下载依赖

先换源安装模块
pip install coreapi -i https://pypi.douban.com/simple

在settings里进行配置

# (四、短信验证码:限流、接口文档)
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',       # 没有登录的匿名用户
        'rest_framework.throttling.UserRateThrottle'        # 登录的用户
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',      # 访问频次,单位可以是hour、minute、second
        'user': '1000/day'      # 访问频次
    },
    'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema'
}

在主路由界面配置接口文档路由

Ls_shopping_center/urls.py:

from django.contrib import admin
from django.urls import path,include
from rest_framework.documentation import include_docs_urls

urlpatterns = [
    path('admin/', admin.site.urls),
    path('school/',include('school.urls')),
    path('docs/',include_docs_urls('lsu Ls_shopping_center API 接口文档')),
]
运行结果

文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!

Editor:Lonelyroots

相关文章

网友评论

      本文标题:Python(六十一)Django Rest Framework

      本文链接:https://www.haomeiwen.com/subject/ntumkrtx.html