目录
-
基于GenericAPIView以及五个视图扩展类写接口
- 一、基于GenericAPIView写接口
- 二 、基于GenericAPIView以及五个视图扩展类写接口
基于GenericAPIView以及五个视图扩展类写接口
一、基于GenericAPIView写接口
GenericAPIView属性
序列化反序列 queryset
- 使用序列化类 serializer_class
- 查询单条路由 lookup_field
- 过滤类的配置 filter_backends
- 分页类的配置 pagination_class
获取序列对象 get_queryset
- 获取单个对象 get_object
- 获取序列化类 get_serializer
- 跟过滤有关的 filter_queryset
# 表模型代码
from django.db import models
class Book(models.Model:
name = models.CharField(verbose_name='书名', max_length=32
price = models.CharField(verbose_name='价格', max_length=32
def __str__(self:
return self.name
# 外键 书跟出版社是一对多
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE
# 外键 书跟作者是多对多
authors = models.ManyToManyField(to='Author'
def publish_detail(self:
return {'name': self.publish.name, 'address': self.publish.address}
def author_list(self:
list = []
for author in self.authors.all(:
list.append({'name': author.name, 'phone': author.phone}
return list
class Publish(models.Model:
name = models.CharField(verbose_name='出版社名称', max_length=32
address = models.CharField(verbose_name='出版社地址', max_length=32
def __str__(self:
return self.name
class Author(models.Model:
name = models.CharField(verbose_name='作者姓名', max_length=32
phone = models.CharField(verbose_name='电话号码', max_length=11
def __str__(self:
return self.name
# 序列化类代码
class BookSerializer(serializers.ModelSerializer:
class Meta:
# 跟book表有强关联
model = Book
# fields = ['写需要序列化的字段名',[]···]
# 如果fields = '__all__'这样写就表明序列化所有字段
fields = '__all__'
# extra_kwargs = {'字段名': {'约束条件': 约束参数},是反序列化字段
extra_kwargs = {'name': {'max_length': 8},
'publish_detail': {'read_only': True},
'authors_list': {'read_only': True},
'publish': {'write_only': True},
'authors': {'write_only': True}
}
def validate_name(self, name:
if name.startswith('sb':
raise ValidationError('书名不能以sb开头'
else:
return name
'''基于GenericAPIView'''
from rest_framework.generics import GenericAPIView
from .models import Book
from .serializer import BookSerializer
from rest_framework.response import Response
class BookView(GenericAPIView:
queryset = Book.objects.all(
serializer_class = BookSerializer
def get(self, request:
objs = self.get_queryset(
ser = self.serializer_class(instance=objs, many=True
return Response(ser.data
def post(self, request:
ser = self.get_serializer(data=request.data
if ser.is_valid(:
ser.save(
return Response({'code': 100, 'msg': '新增成功', 'result': ser.data}
else:
return Response({'code': 101, 'msg': ser.errors}
class BookDetailView(GenericAPIView:
queryset = Book.objects.all(
serializer_class = BookSerializer
def get(self, request, pk:
obj = self.get_object(
ser = self.get_serializer(instance=obj
return Response(ser.data
def put(self, request, pk:
obj = self.get_object(
ser = self.get_serializer(instance=obj, data=request.data
if ser.is_valid(:
ser.save(
return Response({'code':102, 'msg':'修改成功'}
else:
return Response({'code':103, 'msg':ser.errors}
def delete(self, request, pk:
self.get_object(.delete(
return Response({'code':104, 'msg':'删除成功'}
二 、基于GenericAPIView以及五个视图扩展类写接口
首先捋一下五个视图扩展类吧!切记这五个扩展类不能单独使用,必须与GenericAPIView配合使用,需要写哪种接口就用哪个扩展类即可。
新增数据,CreateModelMixin
- 修改数据,UpdateModelMixin
- 删除数据,DestroyModelMixin
- 获取单个,RetrieveModelMixin
- 获取所有,ListModelMixin
'''基于GenericAPIView及五个视图扩展类'''
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin
from .models import Book, Author, Publish
from .serializer import BookSerializer
class BookView(GenericAPIView,ListModelMixin,CreateModelMixin:
queryset = Book.objects.all(
serializer_class = BookSerializer
def get(self, request:
return self.list(request
def post(self, request:
return self.create(request
class BookDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin:
queryset = Book.objects.all(
serializer_class = BookSerializer
def get(self, request, *args, **kwargs:
return self.retrieve(request, *args, **kwargs
def put(self, request, *args, **kwargs:
return self.update(request, *args, **kwargs
def delete(self, request, *args, **kwargs:
return self.destroy(request