serializers多表序列化,请求与响应

多表序列化

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/',views.Books.as_view()),
    path('books/<int:pk>',views.Booksid.as_view()),
]

models.py

from django.db import models

# Create your models here.
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # publish_date = models.DateField(null=True)

    # 关联关系
    publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Author')  # 自动生成中间表

    def publish_detail(self):
        return {'name':self.publish.name,'city':self.publish.city}

    def author_list(self):
        list1 = []
        for author in self.authors.all():
            list1.append(author.name)
        return list1

    def __str__(self):
        return self.name


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
    
    def __str__(self):
        return self.name


class AuthorDetail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

serializer.py

from app01 import models
from rest_framework import serializers


class BooksSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        #方法一
        # fields = ['nid', 'name', 'price', 'publish_detail', 'author_list', 'publish', 'authors']
        # extra_kwargs = {
        #     'publish': {'write_only': True},
        #     'authors': {'write_only': True},
        # }
        ###########################################################################################################
        #方法二:在表模型models中写方法,在序列化类中写到fields中
        fields = ['nid', 'name', 'price',  'publish', 'authors' , 'publish_detail','author_list']
        extra_kwargs = {
            'publish': {'write_only': True},
            'authors': {'write_only': True},
            'publish_detail':{'read_only':True},
            'author_list':{'read_only':True},
        }

    # 方法一:重写字段+必须配合一个方法,方法返回啥,该字段就是什么--->该字段只能序列化
    # publish_detail = serializers.SerializerMethodField(read_only=True)
    #
    # def get_publish_detail(self, book):
    #     return {'name': book.publish.name, 'city': book.publish.city}
    #
    # author_list = serializers.SerializerMethodField(read_only=True)
    #
    # def get_author_list(self, obj):
    #     author_list = []
    #     for author in obj.authors.all():
    #         author_list.append(author.name)
    #     return author_list

views.py

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
# Create your views here.
from .models import Book
from .serialzer import BooksSerializer
class Books(APIView):
    def get(self,request):
        books = Book.objects.all()
        ser = BooksSerializer(instance=books,many=True)
        return Response(ser.data)

    def post(self,request):
        ser = BooksSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code':'200','msg':'添加成功'})
        else:
            return Response({'code': '201', 'msg': '添加失败', 'errors': ser.errors})

class Booksid(APIView):
    def get(self,request,pk):
        book = Book.objects.filter(pk=pk).first()
        ser = BooksSerializer(instance=book,many=False)
        return Response(ser.data)

    def put(self,request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        ser = BooksSerializer(instance=book,data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code':'200','msg':'修改成功🚚 🚚 🚚'})
        else:
            return Response({'code':'201','msg':'修改失败','errors':ser.errors})
    def delete(self,requets,pk):
        Book.objects.all().filter(pk=pk).delete()
        return Response({'code':'删除成功'})

请求与响应

请求

# django ---->请求对象----》request
# django ---->响应对象----》render,HttpResponse,Redirect,JsonResponse---》本质都是HttpResponse

# drf中---》请求对象----》新的request---》drf的Request类的对象
# drf的请求对象
    -request.data
    -request.query_params
    -request.FILES
    
# 控制前端传入的编码格式---》默认 :urlencoded,form-data,json
	# 全局生效
	-项目配置文件中加入
        REST_FRAMEWORK = {
            'DEFAULT_PARSER_CLASSES':[
                'rest_framework.parsers.JSONParser',  # 能够解析json
        		'rest_framework.parsers.FormParser',  # 能够解析urlencoded
        		'rest_framework.parsers.MultiPartParser', #能够解析form-data
               ],
        }
    # 局部生效---》视图类中配置
    class BookView(APIView):
    	parser_classes = [JSONParser,]
        
        
   # 优先级:先找 视图类---》项目配置文件----》drf配置文件

响应

from rest_framework.response import Response

#初始化对象,传入的参数,response对象的属性
    data=None,   # 要序列化的数据,字典,列表,字符串
    status=None, # http响应状态码
    headers=None, # 响应头---》字典
    -------最重要的-----
    template_name=None, #模板名字---》浏览器看的时候,看到好看的页面,postman看,纯json
    content_type=None # 默认json格式,前后端分离项目,前端传用json,后端响应也用json格式
    
    
    
# 浏览器看的时候,看到好看的页面,postman看,纯json----》想控制,都是json格式,无论是浏览器还是postman

	# 全局生效
	-项目配置文件中加入
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES':[
          		'rest_framework.renderers.JSONRenderer',   #json格式
        		'rest_framework.renderers.BrowsableAPIRenderer', #浏览器格式
               ],
        }
    # 局部生效---》视图类中配置
    class BookView(APIView):
    	renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
        
        
   # 优先级:先找 视图类---》项目配置文件----》drf配置文件
posted @ 2022-06-17 18:16  春游去动物园  阅读(82)  评论(0编辑  收藏  举报