1. 程式人生 > 實用技巧 >django介面開發-程式碼優化views_post/put/delete

django介面開發-程式碼優化views_post/put/delete

#優化cbc就程式碼其它post put delete方法,同理

class BaseView(View):
    from_class = None

    @property
    def form(self):
        #issubclass:引數1是不是引數2的子類,校驗model_class
        if self.from_class and issubclass(self.from_class,BaseForm):
            return self.from_class
        raise Exception("未定義from_class
") class PostView(BaseView): def post(self, requests): # 通過form進行資料驗證 form_obj = self.form(requests.POST) # 資料驗證是否通過 if form_obj.is_valid(): self.model.objects.create(**form_obj.cleaned_data) return JsonResponse({"code": 200, "msg": "成功"})
else: return JsonResponse({"code": 500, "msg": form_obj.errors.get_json_data()}) # form_obj.cleaned_data是所有驗證通過的資料
class PutView(BaseView):
def put(self, requests):
# django並沒有處理PUT的資料,實際上put傳過來的資料在request.body
# 需要匯入 from django.http import QueryDict 來處理資料
put_data = QueryDict(requests.body)
# 獲取需要更新哪天資料的主鍵
p_id = put_data.get('id')
# 通過id 從資料庫中取這條資料
data_obj = self.model.objects.get(id=p_id)
# 引數1是前端傳過來的資料,引數2是資料庫中獲取的資料
form_obj = self.form(put_data, instance=data_obj)
if form_obj.is_valid():
# 通過formsave方法進行資料更新
form_obj.save()
return JsonResponse({"code": 200, "msg": "成功"})
else:
return JsonResponse({"code": "500", "msg": form_obj.errors.get_json_data()})



class DeleteView(BaseView):
def delete(self, requests):
p_id = requests.GET.get('id')
# 刪除時,要知道刪除的是哪條資料,獲取主鍵id
# 1-邏輯刪除,改變欄位狀態
self.model.objects.filter(id=p_id).update(is_delete=1) # 這種方式不會觸發updatetime
# 可以觸發updatetime方式
obj = self.model.objects.filter(id=p_id).first()
obj.is_delete = 1
obj.save()
# 2-物理刪除,直接將資料delete
self.model.objects.filter(id=p_id).delete()
return JsonResponse({"msg": "delete"})



class NbView(PostView,PutView,DeleteView):
pass



#views中程式碼:
class SParameter(NbView):
from_class = ParameterForm


#參考forms
from django import forms
from django.forms import ModelForm

from example import models

class ParameterForm(forms,ModelForm):
class Meta:
model = models.Parameter
exclude = ['id','is_delete','update_time','create_time']