1. 程式人生 > 其它 >Django-ORM框架-階段練手小專案

Django-ORM框架-階段練手小專案

技術標籤:python測試開發

Django階段練手小專案


需求

實現資料庫的增刪改查介面:

介面型別url介面詳情
GET/projects/獲取專案列表資料(json陣列形式返回)
POST/projects/建立一條專案資料(以json形式傳遞引數,同時需要將建立成功
GET/projects/int:pk/獲取一條專案詳情資料(json物件形式返回)
PUT/projects/int:pk/更新一條專案資料(以json形式傳遞引數,同時需要將更新成功之後的資料以json形式返回)
DELETE/projects/int:pk/刪除一條專案資料(返回刪除成功json資料)

程式碼實現

projects/views.py

import json
from django.http import JsonResponse
from django.views import View
from projects.models import Projects


err_msg = {
    "status": False,
    "msg": "引數有誤",
    "num": 0
}


class ProjectView(View):

    def get(self, request):
        """
        獲取專案列表資料
        :return: 返回獲取專案列表資料
        """
# 1.獲取全部資料 qs = Projects.objects.all() # 2.獲取到的資料轉化為json資料 projects_list = [] obj: Projects for obj in qs: projects_list.append({ 'id': obj.id, 'name': obj.name, 'leader': obj.leader }
) # 3.將json資料返回 return JsonResponse(projects_list, safe=False, json_dumps_params={"ensure_ascii": False}) def post(self, request): """ 建立一條專案資料(以json形式傳遞引數) :return: 將建立成功之後的資料以json形式返回 """ # 1.獲取前端傳來的json資料 try: json_dict = json.loads(request.body.decode('utf-8')) except Exception: return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400) # 2.對資料進行校驗 if 'name' not in json_dict or len(json_dict['name']) > 20 or len(json_dict['leader']) > 10: return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400) # 3.儲存資料 qs = Projects.objects.create(**json_dict) return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False}) class ProjectParameterView(View): def get(self, request, pk): """ 獲取一條專案詳情資料 :param pk: 專案id :return: 返回獲取到的專案詳情資料 """ # 1.獲取資料 try: data = Projects.objects.get(id=pk) except Exception: return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400) # 2.將資料轉為json格式 json_dict = [] json_dict.append({ 'id': data.id, 'name': data.name, 'leader': data.leader }) # 3.將資料返回前端 return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False}) def put(self, request, pk): """ 更新一條專案資料(以json形式傳遞引數) :param pk: 專案id :return: 將更新成功之後的資料以json形式返回 """ # 1.獲取資料 data = Projects.objects.filter(id=pk) if len(data) == 0: return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400) # 2.讀取前端傳來的json資料 json_dict = json.loads(request.body.decode('utf-8')) # 3.更新資料 data.update(**json_dict) return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False}) def delete(self, request, pk): """ 刪除一條專案資料 :param pk: 專案id :return: 返回刪除成功json資料 """ # 1.獲取資料 try: data = Projects.objects.get(id=pk) except Exception: return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400) # 2.將資料轉為json格式 json_dict = [] json_dict.append({ 'id': data.id, 'name': data.name, 'leader': data.leader }) # 3.刪除資料 data.delete() return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False})

痛點分析

  1. 程式碼冗餘嚴重,不夠簡潔

  2. 資料校驗極為麻煩(if巢狀層級非常多),且複用性比較差

  3. 編碼沒有統一的規範,程式碼維護性差

  4. 獲取列表資料時,有很多缺失的功能
    a.沒有提供分頁功能
    b.沒有提供過濾功能
    c.沒有提供排序功能

  5. 整個介面,也有功能缺失
    a.沒有提供認證授權功能
    b.沒有提供限流功能(反爬蟲)
    c.傳遞引數的形式單一,不支援表單傳參
    d.5個介面處於不同的類檢視中