DRF序列化和分页类的使用

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是定制的分页类,就可以根据定制的分页类来对数据接口页的数据分页了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值