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

Python(六十)Django Rest Framework(

作者: Lonelyroots | 来源:发表于2022-01-22 16:18 被阅读0次

从今天起,做一个大型且功能齐全的商城项目!

小知识科普:

问:Python可以做网页、APP或小程序吗?

答:Python可以做APP或者小程序的后端功能接口,但APP,小程序,网页都不是任何一门语言能够独立开发出来的,如HTML+Django,Java+HTML等等。

快捷键科普:

Ubuntu里快捷键:Ctrl+L是清屏,即命令行快速切换至下一页。

删除分支

命令git branch -d hot-fix:删除热修复分支。

配置项目的环境

mkvirtualenv -p /usr/bin/python3 ls_shopping_center:创建一个虚拟环境ls_shopping_center。


pip install django -i https://pypi.douban.com/simple:这里用国内的源镜像地址能够更快地安装django模块。

pip install djangorestframework -i https://pypi.douban.com/simple:这里用国内的源镜像地址能够更快地安装djangorestframework模块。

pip list:出现如下结果即表示模块安装成功。

django-admin startproject ls_shopping_center:新建一个django项目文件夹ls_shopping_center。

mysql -uroot -p以root用户身份进入mysql数据库

CREATE DATABASE `ls_shopping_center` CHARSET='utf8';新创建一个编码格式为utf8的数据库ls_shopping_center。

创建一个用户,只给它本项目数据库的操作权限。GRANT ALL PRIVILEGES ON ls_shopping_center.* TO 'lsu'@'%' IDENTIFIED BY 'qwe123';:这里是将ls_shopping_center这个数据库中的所有权限都给lsu这个用户,他可以通过密码qwe123进行访问,%是指远程登录。FLUSH PRIVILEGES;:刷新用户权限。

mysql -ulsu -p:通过上方新创建的用户登录数据库。

pip install pymysql -i https://pypi.douban.com/simple安装pymysql模块。

vim .gitignore:编辑配置文件,过滤掉不需要提交的内容。


下方图片中为过滤掉的内容,不参与提交。
过滤掉的内容
git add .git commit -m 'ls_shopping_center init v1.0.0':修改以后提交文件到本地仓库区。

git remote -v查看远程仓库

git push Ls_shopping_center master:将文件推送到Ls_shopping_center这个远程仓库的master分支下。

新建一个app名为user,再新建一个apps文件夹,将其设置为资源根目录文件夹(右键选择Mark Directory as,然后再选择Sources Root),而后将user移动到apps中,后进入到虚拟机中将user文件夹删除掉。

删除user文件夹

ls_shopping_center/init.py:

# (三、验证码实现)
import pymysql

pymysql.install_as_MySQLdb()

ls_shopping_center/settings.py:

......

apps/user/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)      # 允许为空
    sex = models.IntegerField(verbose_name='性别',null=True,blank=True,choices=SEX_CHOICES)
    create_time = models.DateTimeField(max_length=30,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 = 'student'

apps/user/serializers.py:

# -*- coding: utf-8 -*-
# @Time     : 2022/1/24 22:51
# @Author   : Lonelyroots
# @Email    : Lonelyroots@qq.com
# @File     : serializers.py
# @Software : PyCharm

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

        定义的属性就是要参与转换的字段。

        序列化器字段可以少于或多于模型类字段(属性),但字段名必须保持一致。

        定义返回的数据有哪些字段
"""
# from rest_framework import serializers
#
# class StudentSerializer(serializers.Serializer):
#     SEX_CHOICES = (
#         (0,'女'),
#         (1,'男')
#     )        # 大写的变量代表常量,是不可变的
#     id = serializers.IntegerField(label='ID',read_only=True)
#     name = serializers.CharField(max_length=30,label='姓名')
#     age = serializers.IntegerField(label='年龄', required=False)      # 不需要有记录,默认为一定要有记录
#     sex = serializers.IntegerField(label='性别',required=False,choices=SEX_CHOICES)
#     create_time = serializers.DateTimeField(max_length=30,label='创建时间',auto_now_add=True)
#     update_time = serializers.DateTimeField(auto_now=True,label='更新时间')
#     is_delete = serializers.BooleanField(default=False,label='逻辑删除')



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

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

class StudentSerializer(serializers.ModelSerializer):
    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

apps/user/views.py:

from django.shortcuts import render
from rest_framework import viewsets
from .models import Student
from .serializers import StudentSerializer
from rest_framework.response import Response
from rest_framework.status import HTTP_404_NOT_FOUND

# Create your views here.
class StudentViewSet(viewsets.ViewSet):      # 定义了一个视图集类
    def list(self,request):
        """list:返回一组数据"""
        # 获取所有的学生信息,返回的是模型类集合
        students = Student.objects.all()
        # 转json格式,这里实例化序列化器,传入要转换的模型集合,如果是多条数据一般我们加一个参数many=True
        serializer = StudentSerializer(students,many=True)
        # 返回响应:返回序列化后的数据
        return Response(data=serializer.data)

    def create(self,request):
        """创建数据"""
        # 获取前端传入的数据
        serializer = StudentSerializer(data=request.data)   # data得到的是前端的数据,需要转模型类型,反序列化
        # 校验
        serializer.is_valid(raise_exception=True)       # 如果校验不通过,抛一个异常
        # 保存数据
        serializer.save()
        # 返回响应:返回序列化数据
        return Response(data=serializer.data)

    def retrieve(self,request,pk):
        """查看单一数据"""
        try:
            student = Student.objects.get(id=pk)
        except Student.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        serializer = StudentSerializer(instance=student)        # 传的是instance是序列化,传的是data是反序列化
        return Response(data=serializer.data)

apps/user/urls.py:

# -*- coding: utf-8 -*-
# @Time     : 2022/1/25 10:07
# @Author   : Lonelyroots
# @Email    : Lonelyroots@qq.com
# @File     : urls.py
# @Software : PyCharm
from django.urls import path
from .views import StudentViewSet

urlpatterns = [
    # 网页请求是get请求方式,新增数据是post请求方式,
    path('students/',StudentViewSet.as_view({'get':'list','post':'create'})),        # 如果是get请求方式,则调用StudentViewSet的list方法
    path('students/<pk>/',StudentViewSet.as_view({'get':'retrieve'}))
]

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

Editor:Lonelyroots

相关文章

网友评论

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

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