序列化器Serializer
视图函数views
from rest_framework.generics import ListCreateAPIView
class PoemFourAPI(ListCreateAPIView):
poems = Poem.objects.all()
queryset = poems
serializer_class = PoemNewSerializer
只写短短三行然后在urls中完成路由分发即可实现get post请求的处理返回
ListCreateAPIView 类
class ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset or creating a model instance.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
可以看出ListCreateAPIView 实现了 get post 方法 继承了三个类 而GenericAPIView类继承了APIView 在之上APIView继承 常规python 的View 。
因此 实现get post 方法可以处理get post 请求。
put 和 delete等其他请求 不确定 研究的不是很深啊。。。
先说get
如果是get请求。那么调用get方法 可以看出ruturn 的是 list()方法的返回值。list方法在mixins.ListModelMixin类中定义
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
类中只有一个 方法 返回的是Response(serializer.data)
serializer.data 是序列化的数据
可以知道 最后返回的是序列化数据 和queryset 有关
self.filter_queryset方法与self.get_queryset()方法在GenericAPIView类中
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
def get_queryset(self):
assert self.queryset is not None, (
"'%s' should either include a `queryset` attribute, "
"or override the `get_queryset()` method."
% self.__class__.__name__
)
queryset = self.queryset
if isinstance(queryset, QuerySet):
# Ensure queryset is re-evaluated on each request.
queryset = queryset.all()
return queryset
我也没看太懂。不过断言一句说明queryset不能为空或者重写get_queryset()方法因此queryset 应该是 数据 可被序列化器使用的数据
因此需要设置queryset 假设有Poem模型
可使
queryset = Poem.objects.all()
数据有了 我们还需要序列化器
serializer = self.get_serializer(queryset, many=True)。
可以看self.get_serializer()方法 同样在GenericAPIView类中实现
def get_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
返回的是serialzer_class而且 serializer_class = self.get_serializer_class()可以看出,又是调用一个方法
def get_serializer_class(self):
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer_class()` method."
% self.__class__.__name__
)
return self.serializer_class
并没有什么操作 一个断言 然后返回 。也就是没有serializer_class属性会报错。有serizalizer_class属性。则将会作为get_serializer()函数的返回值去处理queryset
serializer = self.get_serializer(queryset, many=True)
所以我们需要设置 serializer_class。是一个序列化器
serializer_class = PoemNewSerializer
因此简单使用ListCreateAPIView类。get请求只需设置两个属性即可
class PoemFourAPI(ListCreateAPIView):
queryset = Poem.objects.all()
serializer_class = PoemNewSerializer
get请求的返回
[
{
"id": 8,
"title": "关山月",
"content": "明月出天山,苍茫云海间。\n长风几万里,吹度玉门关。\n汉下白登道,胡窥青海湾。\n由来征战地,不见有人还。\n戍客望边色,思归多苦颜。\n高楼当此夜,叹息未应闲。",
"price": "100.00"
},
{
"id": 9,
"title": "咏鹅",
"content": "鹅鹅鹅,曲项向天歌。白毛浮绿水,红掌拨清波。",
"price": "45.00"
},
{
"id": 10,
"title": "赋得古原草送别",
"content": "离离原上草,一岁一枯荣。 野火烧不尽,春风吹又生。 远芳侵古道,晴翠接荒城。 又送王孙去,萋萋满别情。",
"price": "45.00"
},
{
"id": 11,
"title": "望岳",
"content": "岱宗夫如何,齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生层云,决眦入归鸟。会当凌绝顶,一览众山小。",
"price": "30.00"
}
]
post请求
处理post请求会调用self.create()方法 在CreateModelMixin中定义
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
可以看出这基本就是序列化保存数据文章开头已经介绍
而get_serizlizer方法前文get已经提到 而
request.data是post请求的数据。
APIView 的使用及一点点原理
因此post请求只要设置serializer_class 即可
以上便是restful中ListCreateAPIView类简单使用。没有重写其中方法
具体实际应用中可以重写 get post 方法 或者重写 create list 方法