ModelSerializer的使用
- ModelSerializer 可以跟表做一一对应关系
- -序列化类中,就不需要一个个写字段了--》跟表有对应关系
- 序列化类中,就不需要重写create和update
【1】serializer类(保存)
- 不需要写create了,但是字段必须是:publish和authors
class PublishSerializer(serializers.Serializer):
name = serializers.CharField()
addr = serializers.CharField()
class AuthorSerializer(serializers.Serializer):
name = serializers.CharField()
age = serializers.IntegerField()
email = serializers.EmailField()
class BookModelSerializer(serializers.Serializer):
class Meta:
model = Book
fields = '__all__'
extra_kwargs = {
'name': {'maxlength': 8},
'publish': {'write_only': True},
'authors': {'write_only': True}
}
# 这个字段用来做序列化
publish_detail = PublishSerializer(source='publish', read_only=True)
authors_list = AuthorSerializer(source='authors', many=True, read_only=True)
- views.py
from django.http import JsonResponse
from django.shortcuts import render
from rest_framework.response import Response
# Create your views here.
from .serializer import BookModelSerializer
from rest_framework.views import APIView
from task_xu.models import Book
class BookView(APIView):
def get(self, request):
books = Book.objects.all()
# BookSerializer实例来序列化查询
serializer = BookModelSerializer(instance=books, many=True)
return Response(serializer.data)
def put(self, request,pk):
obj=Book.objects.all().filter(pk=pk).first()
serializer = BookModelSerializer(instance=obj,data=request.data)
if serializer.is_valid():
# print(serializer.validated_data) # 校验过后的数据
serializer.save()
return Response('更新成功')
else:
return Response({'code': 101, 'msg': serializer.errors})
- json
{
"id":3,
"name": "asdas",
"price": 199,
"pub_date": "2024-04-12",
"publish":1,
"authors":[1,2]
}
练习
【1】
-创建表--》UserLog表
-id
-ip
-时间
-method
-path
-user_agent
-只要用户访问,无论是谁,往这个表里记录一条
-中间件中---》process_request(request)
-ip:request 取出用户访问者ip
-method:request.method
-path :request.get_full_path()
-user_agent:request 客户端类型(postman,request,浏览器)
-项目运行在 0.0.0.0:8000 上
- utils.py 写中间件
def process_request(self, request):
ip = request.META.get('REMOTE_ADDR')
method = request.method
path = request.get_full_path()
user_agent = request.META.get('HTTP_USER_AGENT')
UserLog.objects.create(ip=ip, method=method, path=path, user_agent=user_agent)
- 再去settings里面注册中间件
【2】写一个装饰器
- 装饰视图函数FBV,使得request有data属性,无论哪种编码和请求方式,都是字典
import json
def wrapper(func):
def inner(request,*args, **kwargs):
try:
#1 put,post 提交的数据,只要是json格式---》能成功
#2 put,post 提交的数据,urlencoded,form-data --》抛异常
request.data=json.loads(request.body)
except Exception as e:
# post 提交的数据,urlencoded,form-data
request.data=request.POST
# put 的urlencoded,form-data 不会成
if request.method=='PUT' and not request.data:
# 按 & 分割 = 分割
request.data ={}
res = func(request,*args, **kwargs)
return res
return inner
拓展作业
# 1 反序列化更新,instance 就传要修改的对象,保证修改完成
# 2 反序列化保存和更新,字段如下,实现更新和保存
publish_id=serializers.IntegerField(write_only=True)
authors_l=serializers.ListField(write_only=True)
# 3 book,publish,author,author_detail
-把所有表的5个接口都写好
-不写author_detail,把author_detail统一放在author中
# 4 拓展作业
-找一个混合的后台模板,集成到你项目中
-1 显示用户访问记录
-2 echars---》显示访问客户端类型 饼形图
-https://echarts.apache.org/examples/zh/editor.html?c=pie-simple
-3 图书增删查改