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

 django2.x 序列化 随笔

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

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄