快速入手-基于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

相关推荐
爱宇阳17 分钟前
如何将本地 Jar 包安装到 Maven 仓库(以 Aspose 为例)
python·maven·jar
数据系的公考小白17 分钟前
2025五一杯数学建模C题代码分享
python·数学建模·pandas·五一杯
啊阿狸不会拉杆24 分钟前
人工智能数学基础(十)—— 图论
人工智能·python·数学·算法·图论
AlexandrMisko30 分钟前
从零实现基于Transformer的英译汉任务
人工智能·pytorch·python·深度学习·transformer
进来有惊喜33 分钟前
主成分分析(PCA)与逻辑回归在鸢尾花数据集上的实践与效果对比
python
鬼义II虎神37 分钟前
Django缓存框架API
python·缓存·django
执键行天涯38 分钟前
Apache Velocity代码生成简要介绍
开发语言·python·apache
患得患失94943 分钟前
【python】【UV】一篇文章学完新一代 Python 环境与包管理器使用指南
开发语言·python·uv
一个天蝎座 白勺 程序猿1 小时前
Python爬虫(19)Python爬虫破局动态页面:逆向工程与无头浏览器全链路解析(从原理到企业级实战)
开发语言·爬虫·python·websocket·ajax
小威编程1 小时前
RabbitMQ 添加新用户和配置权限
开发语言·后端·rabbitmq·ruby