快速入手-基于Django-rest-framework的serializers序列化器(二)

1、序列化器作用

json序列化:将python转化为json对象字符串;

json反序列化:将json转化为python ORM对象保存到数据库。进行反序列化器时需要对每个提交过来的字段进行校验。

2、创建serializer.py文件

专门放序列化器使用。DRF接口比普通的网址多个一步:模型--序列化器---路由----视图

3、mysql数据库配置

参考快速入手-基于Django的mysql配置(三)-CSDN博客文章浏览阅读398次。打开 Django 项目的 settings.py 文件,找到 DATABASES 配置部分,并将其修改为指向你的 MySQL 数据库。比如mysql,旧版本用pymysql对比较多,新的版本采用mysqlclient。注意:该模块一定要已经被注册到settings.py中的INSTALLED_APPS。(1)CRUD数据库中的表,不用写sql语句。5、在对应的模块中的models.py中创建对应的类。4、 配置 Django 项目中的mysql。2、Django的ORM主要做了两件事。https://blog.csdn.net/zsb706496992/article/details/146401171?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-3-146401171-blog-146390412.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-3-146401171-blog-146390412.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=4

4、在api模块中创建Link

python 复制代码
from django.db import models


lunfan_liebiao = [
    (1, "分组1"),
    (2, "分组2"),
    (3, "分组3"),
]


class Link(models.Model):

    gid = models.SmallIntegerField(
        verbose_name="分组", choices=lunfan_liebiao, default=1
    )
    name = models.CharField(verbose_name="关键词", max_length=300)
    link = models.CharField(verbose_name="网址", max_length=100, blank=True, null=True)
    sorting = models.IntegerField(verbose_name="排序", default=100)
    create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    update_time = models.DateTimeField(verbose_name="更新时间", auto_now=True)

    class Meta:
        ordering = ["sorting"]
        verbose_name = "友情链接"
        verbose_name_plural = verbose_name

5、在serializer.py创建LinkSerializer

python 复制代码
from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView

from .models import Link

from rest_framework import serializers


class LinkSerializer(serializers.Serializer):
    #对外展示或操作的字段,或者转换后的字段(比如name对外展示为mingzi)
    id = serializers.CharField(max_length=300)
    mingzi = serializers.CharField(max_length=300, source="name")
    link = serializers.CharField(max_length=100)
    sorting = serializers.IntegerField(default=100)

    # 新增保存数据过程
    def create(self, validated_data):
        new_link = Link.objects.create(**self.validated_data)
        return new_link

    # 更新保存数据过程
    def update(self, instance, validated_data):
        Link.objects.filter(pk=instance.id).update(**validated_data)
        gengxin = Link.objects.get(pk=instance.pk)
        return gengxin

6、视图函数模块views.py

python 复制代码
from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from api.serializer import *

# Create your views here.


class index(APIView):
    def get(self, request):
        return Response({"message": "Get Hello, world!"})

    def post(self, request):
        return Response({"message": "Post Hello, world!"})


class Linkapi(APIView):
    #  查看所有字段
    def get(self, request):
        link_list = Link.objects.all()

        serial = LinkSerializer(link_list, many=True)
        return Response(serial.data)

    # 新增数据
    def post(self, request):

        xuliehua = LinkSerializer(data=request.data)
        if xuliehua.is_valid():
            xuliehua.save()
            return Response(xuliehua.data)
        else:
            return Response(xuliehua.errors)


# 指定一条的请求 删除  查一条、修改一条
class Linkapidetail(APIView):
    # 查询单条记录
    def get(self, request, id):
        # 由于单查,更新,删除都调用了这个查询,为了避免错误和集中管理
        # 可以新建一个方法放查询模型类的sql预计,之后在用try:   except  Exception as e:
        # 没有查到返回raise HTTP404()
        link = Link.objects.get(pk=id)
        # 序列化
        xuliehua = LinkSerializer(instance=link, many=False)
        return Response(xuliehua.data)

    # 更新单条数据
    def put(self, request, id):
        update_link = Link.objects.get(pk=id)
        xuliehua = LinkSerializer(instance=update_link, data=request.data)
        if xuliehua.is_valid():
            xuliehua.save()
            return Response(xuliehua.data)
        else:
            return Response(xuliehua.errors)

    # 更新单条数据中的部分字段  ,和put方法里边内容几乎一样,除了partial=True
    def patch(self, request, id):
        update_link = Link.objects.get(pk=id)
        xuliehua = LinkSerializer(instance=update_link, data=request.data, partial=True)
        if xuliehua.is_valid():
            xuliehua.save()
            return Response(xuliehua.data)
        else:
            return Response(xuliehua.errors)

    def delete(self, request, id):
        Link.objects.get(pk=id).delete()
        return Response("删除成功")

7、在api模块中配置urls.py

python 复制代码
from django.urls import path, re_path
from . import views

app_name = "api"
urlpatterns = [
    path("", views.index.as_view(), name="index"),
    path("linkapi/", views.Linkapi.as_view()),
    re_path("linkapi/(\d+)", views.Linkapidetail.as_view()),
]

8、在总的urls.py配置

python 复制代码
from django.contrib import admin
from django.urls import path, include

from app_drf01 import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("test/", views.test),
    path("api/", include(("api.urls", "api"), namespace="api")),
    path("hello/", views.HelloView.as_view(), name="hello"),
]

9、settings.py数据库的配置

python 复制代码
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "python_demo",  # 数据库名称
        "USER": "root",  # 数据库用户名
        "PASSWORD": "1234567890",  # 数据库密码
        "HOST": "127.0.0.1",  # 数据库主机地址
        "PORT": "13306",  # 数据库端口
    }
}

10、api模块和drf注册

python 复制代码
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "app_drf01.apps.AppDrf01Config",
    "api.apps.ApiConfig",
]

11、使用apifox运行测试

12、查询http://127.0.0.1:8000/api/linkapi/

13、新增POST方式,http://127.0.0.1:8000/api/linkapi/

传输数据:

{

"id":"1",

"mingzi": "花联网平台",

"link": "https://opweb.sasac.gov.cn",

"sorting": 102

}

14、全量数据更新

PUT

http://127.0.0.1:8000/api/linkapi/1

{

"id":"1",

"mingzi": "互联网平台",

"link": "https://opweb.sasac.gov.cn",

"sorting": 102

}

15、部分数据更新

PATCH

http://127.0.0.1:8000/api/linkapi/1

{

"mingzi": "监管网平台",

"link": "https://opreg.sasac.gov.cn"

}

16、删除数据

DELETE

http://127.0.0.1:8000/api/linkapi/7

相关推荐
Vitalia1 小时前
从零开始学Rust:枚举(enum)与模式匹配核心机制
开发语言·后端·rust
飞飞翼1 小时前
python-flask
后端·python·flask
林九生2 小时前
【Python】Browser-Use:让 AI 替你掌控浏览器,开启智能自动化新时代!
人工智能·python·自动化
草捏子2 小时前
最终一致性避坑指南:小白也能看懂的分布式系统生存法则
后端
猿界零零七3 小时前
执行paddle.to_tensor得到全为0
python·paddle
一个public的class3 小时前
什么是 Java 泛型
java·开发语言·后端
青花瓷3 小时前
智谱大模型(ChatGLM3)PyCharm的调试指南
人工智能·python·大模型·智谱大模型
独好紫罗兰4 小时前
洛谷题单2-P5715 【深基3.例8】三位数排序-python-流程图重构
开发语言·python·算法
头孢头孢4 小时前
k8s常用总结
运维·后端·k8s
TheITSea4 小时前
后端开发 SpringBoot 工程模板
spring boot·后端