models创建
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.IntegerField()
pub_date = models.DateField()
序列化器
序列化编写view
from book.models import Book
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
# 序列化器
class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
# 输出的是date但使用的是数据库中的pub_date
date = serializers.DateField(source="pub_date")
class BooksSerView(APIView):
def get(self, request):
# 获取数据
book_list = Book.objects.all()
# 构建序列化器对象 instance 序列化传参 data 反序列化传参
serializer = BookSerializers(instance=book_list, many=True)
# 序列化做了类似如下流程
"""
temp = []
for obj in book_list:
d = {}
d["title"] = obj.title
d["price"] = obj.price
d["pub_date"] = obj.pub_date
temp.append(d)
"""
return Response(serializer.data)
url
from django.urls import path
from . import views
urlpatterns = [
path('book/', views.BooksSerView.as_view())
]
反序列化
from book.models import Book
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
# 序列化器
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):
obj = Book.objects.create(**validated_data)
# 需要给返回值
return obj
class BooksSerView(APIView):
def post(self, request):
# 获取请求数据
data = request.data
# 构建序列化器对象 反序列化传data
serializer = BookSerializers(data=data)
# 数据校验
if serializer.is_valid():
# 校验通过 插入到数据库
# Book.objects.create(**validated_data)
# 使用serializer.save() 需要在序列化器中重写save()
obj = serializer.save()
# 序列化后的数据在data中直接返回
return Response(serializer.data)
else:
# 错误信息在errors中直接返回
return Response(serializer.errors)
修改
view
from book.models import Book
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
class BookSerializers(serializers.Serializer):
# 对应返回数据,写谁返回谁
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
date = serializers.DateField(source="pub_date")
# 重写update方法
def update(self, instance, validated_data):
Book.objects.filter(pk=instance.pk).update(**validated_data)
update_book = Book.objects.get(pk=instance.pk)
return update_book
class BookDetailView(APIView):
def put(self, request, id):
# 获取
book = Book.objects.get(pk=id)
# 更新要将instance和data都传入序列化
serializer = BookSerializers(instance=book, data=request.data)
if serializer.is_valid():
# 更新
# Book.objects.filter(pk=id).update(**serializer.validated_data)
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
url
from django.urls import path, include, re_path
from . import views
urlpatterns = [
re_path('book/(\d+)', views.BookDetailView.as_view())
]
模型序列化器
模型内部帮助我们实现了create、update等方法,无需我们重写
from book.models import Book
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
class BookSerializers(serializers.ModelSerializer):
# pub_date 转化为 date
date = serializers.DateField(source="pub_date")
class Meta:
model = Book
fields = '__all__'
# 只对title和price进行序列化
# fields = ['title', 'price']
# id和pub_date重写了不要
# exclude = ['pub_date', 'id']
class BooksSerView(APIView):
def get(self, request):
# 获取数据
book_list = Book.objects.all()
# 构建序列化器对象 instance 序列化传参 data 反序列化传参
serializer = BookSerializers(instance=book_list, many=True)
# 序列化做了类似如下流程
"""
temp = []
for obj in book_list:
d = {}
d["title"] = obj.title
d["price"] = obj.price
d["pub_date"] = obj.pub_date
temp.append(d)
"""
return Response(serializer.data)
def post(self, request):
# 获取请求数据
data = request.data
# 构建序列化器对象 反序列化传data
serializer = BookSerializers(data=data)
# 数据校验
if serializer.is_valid():
# 校验通过 插入到数据库
serializer.save()
# 序列化后的数据在data中直接返回
return Response(serializer.data)
else:
# 错误信息在errors中直接返回
return Response(serializer.errors)
class BookDetailView(APIView):
def get(self, request, id):
# 获取
book = Book.objects.get(pk=id)
# 序列化
serializer = BookSerializers(instance=book, many=False)
# 返回
return Response(serializer.data)
def put(self, request, id):
# 获取
book = Book.objects.get(pk=id)
# 更新要将instance和data都传入序列化
serializer = BookSerializers(instance=book, data=request.data)
if serializer.is_valid():
# 更新
# Book.objects.filter(pk=id).update(**serializer.validated_data)
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)