使用django rest framwork 寫接口

本文使用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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章