1、序列化器作用
json序列化:将python转化为json对象字符串;
json反序列化:将json转化为python ORM对象保存到数据库。进行反序列化器时需要对每个提交过来的字段进行校验。
2、创建serializer.py文件
专门放序列化器使用。DRF接口比普通的网址多个一步:模型--序列化器---路由----视图

3、mysql数据库配置
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
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("删除成功")
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
