1. Serializer 写法
# 针对模型,设计序列化器
class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
date = serializers.DateField(source='pub_date')
# 重写或者说是,实现create()方法
def create(self, validated_data):
new_book = Book.objects.create(**self.validated_data)
return new_book
def update(self, instance, validated_data):
Book.objects.filter(pk=instance.pk).update(**self.validated_data)
update_book = Book.objects.get(pk=instance.pk)
return update_book
2. ModelSerializer 写法(模型类序列化器)
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = Book
(1) 优点
- 写法很简单
- 覆盖了各种字段,包括一对多,多对多字段
- 生成了序列化的字段
- 自动写好了 create() update(),并且考虑了各种各样的方法
(2) 缺点
形成了强耦合,不灵活
(3) 完整代码
from django.http import HttpResponse
from django.shortcuts import render
from rest_framework.views import APIView
from sers.models import Book
from rest_framework import serializers
from rest_framework.response import Response
# 针对模型,设计序列化器
# class BookSerializers(serializers.Serializer):
# title = serializers.CharField(max_length=32)
# price = serializers.IntegerField()
# date = serializers.DateField(source='pub_date')
#
# # 重写或者说是,实现create()方法
# def create(self, validated_data):
# new_book = Book.objects.create(**self.validated_data)
# return new_book
#
# def update(self, instance, validated_data):
# Book.objects.filter(pk=instance.pk).update(**self.validated_data)
# update_book = Book.objects.get(pk=instance.pk)
# return update_book
class BookSerializers(serializers.ModelSerializer):
# 单独配置的,单独写就行,但是会多加一个,同类型同约束的名称
date = serializers.DateField(source='pub_date')
class Meta:
model = Book
# fields = ["title", "price"] # 只要哪些字段
fields = "__all__" # 返回全部的字段,包括id
# 注意: fields 和 exclude 只能出现一个
# exclude = ['pub_date'] # 不返回哪个字段
class BookView(APIView):
# 查所有
def get(self, request):
# 获取所有的书籍
book_list = Book.objects.all()
# 构建序列化器对象 BookSerializers(instance=,data=,many=)
# instance,是用来做序列化器的
# data,是用来做反序列化器的
# many, 序列化的是一个模型类对象还是多个模型类对象, True/Falseid
serializer = BookSerializers(instance=book_list, many=True)
return Response(serializer.data)
# 增加一个
def post(self, request):
# 获取参数
data = request.data
# 构建序列化器对象
serializer = BookSerializers(data=data)
# 校验数据
# 校验原理:
# 1.所有符合的数据都放在,serializer.validated_data
# 2.不符合数据的都放在,serializer.errors
if serializer.is_valid(): # 返回一个布尔值,所有字段都符合才返回True,反之,返回False
# 数据校验通过,存入数据库中
# new_book = Book.objects.create(**serializer.validated_data)
serializer.save()
return Response(serializer.data)
else:
# 数据校验失败
return Response(serializer.errors)
class BookDetailsView(APIView):
# 查一个
def get(self, request, id):
book = Book.objects.get(pk=id)
serializer = BookSerializers(instance=book)
return Response(serializer.data)
def put(self, request, id):
book = request.data
update_book = Book.objects.get(pk=id)
# 构建序列化器对象
serializer = BookSerializers(instance=update_book, data=book)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
def delete(self, request, id):
Book.objects.get(pk=id).delete()
return Response()
postman调用结果