1.项目知识小科普:
线上仓库如果有更新,先拉取到本地仓库,然后通过以下步骤重新推送。
git pull
:先从线上仓库拉取数据到本地仓库。修改
git add
:将文件提交到暂存区git commit
:将文件从暂存区提交到本地仓库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
网友评论