DRF序列化和分页类的使用
使用DRF(djangorestframework)序列化
安装
pip install djangorestframework
创建模型序列化器
class SubjectSerializer(serializers.ModelSerializer):
"""用于序列化模型"""
class Meta:
model = Subject
fields = '__all__' # 序列化所有字段
# exclude = ('create_date',) # 不会序列化这个字段,右边是元组
序列化器需要继承自serializer下的ModelSerializer模型,model是序列化器的目标模型,可以通过fields指定需要序列化哪些字段,exclude将指定字段排除在序列化字段外。
单独处理字段
class TeacherSerializer(serializers.ModelSerializer):
gender = serializer.SerializerMethodField()
@staticmethod
def get_gender(teacher):
return '男' if teacher.gender else '女'
class Meta:
model = Teacher
exclude = ('subject')
首先将要定制的那个字段声明为序列化器的序列化方法字段(即第二句),接着需要声明一个静态方法,方法名一定要是‘get_<字段名>’的形式,参数是这个字段对应类的对象。
利用序列化器的视图
FBV基于函数的视图
@api_view(('GET',))
def show_subjects(request)
queryset = Subject.objects.all()
serializer = SubjectSerializer(queryset, many=True)
return Response(serializer.data)
因为这个queryset是一个列表,所以要有many=True,这个Response是rest_framework中的,也可以使用JsonResponse。
CBV基于类的视图
class SubjectViewSet(ModelViewSet);
queryset = Subject.objects.all()
serializer_class = SubjectSerializer
这三行代码就提供了增删改查的全部数据接口,前端可能要写三天。
在这之后,需要在urls中注册路由器:
router = DefaultRouter()
router.register('subjects', SubjectViewSet)
urlpatterns += router.urls
在页面上请求subjects路由就能看到数据接口页面了。
类视图重写方法定制数据接口
class TeacherViewSet(ModelViewSet):
queryset =Teacher.objects.all().defer('subject')
serializer_class = TeacherSerializer
def get_queryset(self):
queryset = Teacher.objects.all().defer('subject')
sno = self.request.GET.get('sno')
if sno:
queryset = queryset.filter(subject__no=sno)
return queryset
def get_serializer_class(self):
if self.request.method in ('POST','PUT','PATCH'):
return TeacherCreateSerializer
return TeacherSerializer
第一个方法是拿到指定学科的老师,而不是单纯的所有的老师;第二个方法修改了序列化器,如果请求时post、put和patch,即新增和修改,则是使用的是TeacherCreateSerializer的序列化器。
分页类的使用
在settings中配置:
REST_FRAMEWORK = {
# 配置默认页面大小
'PAGE_SIZE': 5,
# 配置默认的分页类
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 'DEFAULT_PAGINATION_CLASS': ‘polls.utils.CustomizePagination’
}
设置之后,所有的数据接口页面都会使用这个默认的分页类,如果想要自己定制分页类,可以自己定义一个分页类:
class CustomizePagination(PageNumberPagination):
page_size_query_param = 'size'
max_page_size = 50
这个定制的分页类的参数为size,当请求数据接口页的时候在后面跟上size=n,就能每页分n个数据,max_page_size则设置每页最多有50个数据。
如果要使用定制的分页类,有两种方法:
1.settings配置中修改:
'DEFAULT_PAGINATION_CLASS': ‘polls.utils.CustomizePagination’
这里我是将定制的分页类写在polls下的utils.py模块中。
2.在类视图中添加:
class TeacherViewSet(ModelViewSet):
queryset = Teacher.objects.all().defer('subject')
serializer_class = TeacherSerializer
pagination_class = CustomizePagination
CustomziePagination是定制的分页类,就可以根据定制的分页类来对数据接口页的数据分页了。