APIVIEW
我们还是以五个接口为例,基于APIView + + 做五个接口:
models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=64)
price = models.IntegerField()
publish = models.CharField(max_length=64)
views.py
from rest_framework.views import APIView
# Create your views here.
from .serializer import BookSerializer
from rest_framework.response import Response
from .models import Book
class BookView(APIView):
def get(self, request):
obj_list = Book.objects.all()
serialize = BookSerializer(instance=obj_list, many=True)
return Response({'code': 100, 'msg': '查询成功', 'results':serialize.data})
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'code':100, 'msg': '添加成功'})
else:
return Response({'code': 101, 'msg': '添加失败'})
class BookDetailView(APIView):
def get(self, request, pk):
obj = Book.objects.filter(pk=pk).first()
serializer = BookSerializer(instance=obj)
return Response({'code': 100, 'msg': '查询成功', 'results': serializer.data})
def delete(self, request, pk):
obj = Book.objects.filter(pk=pk).delete()
return Response({'code': 100, 'msg': '删除成功'})
def put(self, request, pk):
obj = Book.objects.filter(pk=pk).first()
serializer = BookSerializer(instance=obj, data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'code':100, 'msg': '修改成功'})
else:
return Response({'code': 101, 'msg': '修改失败'})
serializer.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
GenericAPIView
首先,先导入GenericAPIView:
from rest_framework.generics import GenericAPIView
然后,基于GenericAPIView+序列化类+Response 做五个接口:
views.py
from .serializer import BookSerializer
from rest_framework.response import Response
from .models import Book
from rest_framework.generics import GenericAPIView
class BookView(GenericAPIView):
queryset = Book.objects.all() # 查看所有数据
serializer_class = BookSerializer # 序列化类
def get(self, request):
# 使用get_queryset方法获取所有数据
obj_list = self.get_queryset()
# 使用序列化类,直接使用方法self.get_serializer
serialize = self.get_serializer(instance=obj_list, many=True)
return Response({'code': 100, 'msg': '查询成功', 'results':serialize.data})
def post(self, request):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'code':100, 'msg': '添加成功'})
else:
return Response({'code': 101, 'msg': '添加失败'})
class BookDetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, pk):
obj = self.get_object()
serializer = self.get_serializer(instance=obj)
return Response({'code': 100, 'msg': '查询成功', 'results': serializer.data})
def delete(self, request, pk):
self.get_object().delete()
return Response({'code': 100, 'msg': '删除成功'})
def put(self, request, pk):
obj = self.get_object()
serializer = self.get_serializer(instance=obj, data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'code':100, 'msg': '修改成功'})
else:
return Response({'code': 101, 'msg': '修改失败'})
继承GenericAPIView就是在继承APIView的基础上进行一层封装
总结:
- 如果想写publish的五个接口,只需要改两个类属性就行
- 两个类属性:
-
- queryset
- serializer_class
- 三个方法:
-
- self.get_object():用于获取特定对象实例。
- self.get_serializer():用于获取序列化器实例。
- self.get_queryset():用于获取查询集。