本文使用django rest framwork 來寫接口,包括了以下10種類型:
1.單增 2.羣增 3.單查 4.羣查 5.單整體改(個人覺得有了單局部改,單整體改的意義不是很大) 6.單局部改 7.羣整體改(同理)
8.羣局部改 9.單刪 10.羣刪
1.models層
from django.db import models
class BaseModel(models.Model): #基類 is_delete = models.BooleanField(default=False) create_time = models.DateTimeField(auto_now_add=True) class Meta: abstract = True
class Testcase(BaseModel): name = models.CharField(max_length=120) pre_step = models.CharField(max_length=200) step = models.CharField(max_length=300) expect = models.CharField(max_length=200) actual = models.CharField(max_length=200) class Meta: db_table = 'testcase' verbose_name = '測試用例' verbose_name_plural = verbose_name def __str__(self): return self.name
2.serializers層
from rest_framework.serializers import ModelSerializer from rest_framework import serializers from rest_framework import exceptions from . import models
class MyListSerializer(serializers.ListSerializer): # 羣改需要重新update方法 def update(self, instance, validated_data): for index, obj in enumerate(instance): self.child.update(obj, validated_data[index]) return instance class TestcaseSerializer(ModelSerializer): create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) class Meta: model = models.Testcase fields = '__all__' list_serializer_class = MyListSerializer # 爲了羣改 def validate_name(self, value): if models.Testcase.objects.filter(name=value, is_delete=False): raise exceptions.ValidationError('測試用例已存在') return value
3.views層
from rest_framework.viewsets import GenericViewSet from rest_framework import mixins from . import models from . import serializers from utils.myresponse import myResponse
class TestcaseView(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, GenericViewSet): queryset = models.Testcase.objects.filter(is_delete=False) serializer_class = serializers.TestcaseSerializer def my_get_list(self, request, *args, **kwargs): # 羣查 response = self.list(request, *args, **kwargs) return myResponse(data=response.data, count=len(response.data)) def my_get_obj(self, request, *args, **kwargs): # 單查 response = self.retrieve(request, *args, **kwargs) return myResponse(data=response.data) def my_create(self, request, *args, **kwargs): # 單增和羣增 res_data = request.data if isinstance(res_data, dict): many = False elif isinstance(res_data, list): many = True else: return myResponse(msg='傳參格式錯誤啦') seria = self.get_serializer(data=res_data, many=many) seria.is_valid(raise_exception=True) seria.save() return myResponse(data=seria.data) def my_update(self, request, *args, **kwargs): # 單整體改 res = self.update(request, *args, **kwargs) return myResponse(data=res.data) def my_patch(self, request, *args, **kwargs): # 單局部改 res = self.partial_update(request, *args, **kwargs) return myResponse(data=res.data) def my_updates(self, request, *args, **kwargs): # 羣整體改 req_data = request.data if not isinstance(req_data, list): return myResponse(msg='格式錯誤,傳參格式應該要是一個列表') objs = [] request_data = [] for rd in req_data: if 'pk' not in rd: return myResponse('數據沒有包含pk字段') pk = rd.pop('pk', None) obj = models.Testcase.objects.filter(pk=pk, is_delete=False).first() if not obj: return myResponse('要更新的數據不存在,pk=%s' % pk) objs.append(obj) request_data.append(rd) # seria = self.get_serializer(instance=objs, data=request_data, many=True, partial=False) seria = serializers.TestcaseSerializer(instance=objs, data=request_data, partial=False, many=True) seria.is_valid(raise_exception=True) seria.save() return myResponse(seria.data) def my_patchs(self, request, *args, **kwargs): # 羣局部改 req_data = request.data if not isinstance(req_data, list): return myResponse(msg='格式錯誤,傳參格式應該要是一個列表') objs = [] request_data = [] for rd in req_data: if 'pk' not in rd: return myResponse('數據沒有包含pk字段') pk = rd.pop('pk', None) obj = models.Testcase.objects.filter(pk=pk, is_delete=False).first() if not obj: return myResponse('要更新的數據不存在,pk=%s' % pk) objs.append(obj) request_data.append(rd) seria = self.get_serializer(instance=objs, data=request_data, partial=True, many=True) seria.is_valid(raise_exception=True) seria.save() return myResponse(data=seria.data) def my_delete(self, request, *args, **kwargs): # 單刪 pk = kwargs.get('pk') obj = models.Testcase.objects.filter(pk=pk, is_delete=False).first() if not obj: return myResponse(msg='數據不存在') obj.is_delete = True obj.save() return myResponse(msg='刪除成功') def my_deletes(self, request, *args, **kwargs): # 羣刪 if not isinstance(request.data, dict): return myResponse(msg='數據格式錯誤,期望是字典') pks = request.data.get('pks') if not pks: return myResponse(msg='傳參有問題,沒有傳pks') for pk in pks: obj = models.Testcase.objects.filter(pk=pk, is_delete=False).first() if not obj: return myResponse(msg='數據不存在,pk=%s' % pk) for pk in pks: obj = models.Testcase.objects.filter(pk=pk, is_delete=False).first() obj.is_delete = True obj.save() return myResponse(msg='刪除成功')
4.urls層:
from django.contrib import admin from django.urls import path,include from django.views.static import serve from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), path('api01/', include('api01.urls')) ]
5.api01 urls層
from django.urls import path from . import views urlpatterns = [ path('testcase/', views.TestcaseView.as_view( {'get': 'my_get_list', 'post': 'my_create', 'put': 'my_updates', 'patch': 'my_patchs', 'delete': 'my_deletes'})), path('testcase/<pk>/', views.TestcaseView.as_view( {'get': 'my_get_obj', 'put': 'my_update', 'patch': 'my_patch', 'delete': 'my_delete'})) ]
6.utils 中自定義的myResponse
from rest_framework.response import Response class myResponse(Response): def __init__(self, data=None, status=0, http_status=None, msg='執行成功', headers=None, exception=False, *args, **kwargs): data1 = { 'status': status, 'msg': msg, 'data': data } data1.update(kwargs) super().__init__(data=data1, status=http_status, headers=headers, exception=exception)