django2.x 序列化
models.py
from django.db import models
# Create your models here.
class Idc(models.Model): name = models.CharField("机房名称",max_length=32) address = models.CharField("机房地址",max_length=256) phone = models.CharField("联系人",max_length=15) email = models.EmailField("邮件地址",default="null") letter = models.CharField("IDC简称",max_length=5) def __str__(self): return self.name class Meta: db_table = 'resources_idc'
serializers.py
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
"""
Idc 序列化类
"""
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(required=True, max_length=32)
address = serializers.CharField(required=True, max_length=256)
phone = serializers.CharField(required=True, max_length=15)
email = serializers.EmailField(required=True)
letter = serializers.CharField(required=True, max_length=5)
#必须有create,才能使用save(), data={...} a=IdcSerializer(data=data) a.save()
def create(self, validated_data):
return Idc.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.address = validated_data.get("address", instance.address)
instance.phone = validated_data.get("phone", instance.phone)
instance.email = validated_data.get("email", instance.email)
instance.save()
return instance
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
版本三 :APIView
urlpatterns = [ url("^$", views.api_root), url("^idcs/$", views.IdcList.as_view(), name="idc-list"), url("^idcs/(?P<pk>[0-9]+)/$", views.IdcDetail.as_view(), name="idc_detail") ] urlpatterns = format_suffix_patterns(urlpatterns)
from rest_framework.views import APIView from django.http import Http404 class IdcList(APIView): def get(self, request, format=None): queryset = Idc.objects.all() serializer = IdcSerializer(queryset, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = IdcSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST) class IdcDetail(APIView): def get_object(self, pk): try: return Idc.objects.get(pk=pk) except Idc.DoesNotExist: raise Http404 def get(self, request, pk, format=None): idc = self.get_object(pk) serializer = IdcSerializer(idc) return Response(serializer.data) def put(self, request, pk, format=None): idc = self.get_object(pk) serializer = IdcSerializer(idc, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND) def delete(self, request, pk, format=None): idc = self.get_object(pk) idc.delete() return HttpResponse(status=status.HTTP_204_NO_CONTENT)
版本四:使用混合类实现
需要自己重复写get、post方法
class IdcList_V4(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin): queryset = Idc.objects.all() serializer_class = IdcSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
class IdcDetail_V4(generics.GenericAPIView,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin):
queryset = Idc.objects.all()
serializer_class = IdcSerializer
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, *args, **kwargs)
版本五:使用高级混合实现
父类包含具体请求方式,如:ListCreateAPIView包括了get
urlpatterns = [ url("^$", views.api_root), url("^idcs/$", views.IdcList_V5.as_view(), name="idc-list"), url("^idcs/(?P<pk>[0-9]+)/$", views.IdcDetail_V5.as_view(), name="idc_detail") ] urlpatterns = format_suffix_patterns(urlpatterns)
class IdcList_V5(generics.ListCreateAPIView):#包括查找和创建
queryset = Idc.objects.all() serializer_class = IdcSerializer
class IdcDetail_V5(generics.RetrieveUpdateDestroyAPIView): #包括 详细查找 、更新和删除
queryset = Idc.objects.all()
serializer_class = IdcSerializer
版本六:viewset扩展实现
将所有请求用一个class实现,如:GenericViewSet+ListModelMixin
########################## 版本六 ############################ idc_list = views.IdcListViewset.as_view({ "get": "list", "post": "create" }) idc_detail = views.IdcListViewset.as_view({ "get": "retrieve", "put": "update", "delete": "destroy" }) urlpatterns = [ url("^$", views.api_root), url("^idcs/$", idc_list, name="idc-list"), url("^idcs/(?P<pk>[0-9]+)/$", idc_detail, name="idc_detail") ]
from rest_framework import viewsets class IdcListViewset(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, mixins.UpdateModelMixin, mixins.CreateModelMixin): queryset = Idc.objects.all() serializer_class = IdcSerializer
版本七:router实现:
整合:ModelViewSet包括所有方法
########################## 版本七 ############################ from rest_framework.routers import DefaultRouter route = DefaultRouter() route.register("idcs", views.IdcViewset_v7) urlpatterns = [ url(r'^', include(route.urls)) ]
class IdcViewset_v7(viewsets.ModelViewSet): queryset = Idc.objects.all() serializer_class = IdcSerializer

更多精彩