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 图书增删查改
    
posted @ 2024-04-17 22:12  -半城烟雨  阅读(0)  评论(0编辑  收藏  举报