Django FBV/CBV接口开发方式
#FBV接口开发:用函数实现的view 叫做FBV
import datetime from itertools import chain from django.core.paginator import Paginator from django.http import JsonResponse, QueryDict, HttpResponse from django.shortcuts import render from . import models from .forms import ParameterForm # Create your views here. def model_to_dict(instance, fields=None, exclude=None): opts = instance._meta data = {} for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many): if fields and f.name not in fields: continue if exclude and f.name in exclude: continue value = f.value_from_object(instance) if isinstance(value, datetime.datetime): value = value.strftime('%Y-%m-%d %H:%M:%S') if isinstance(value, datetime.date): value = value.strftime('%Y-%m-%d') data[f.name] = value return data #FBV def f_parameter(requests): if requests.method == 'GET': #get请求时 获取传递过来的第几页数据 page = requests.GET.get('page') qs = models.Parameter.bojects.filter(is_delete=0) page_obj = Paginator(qs,5) #获取第几页的数据 page_data = page_obj.get_page(page) #用于存储返回的dict类型数据 data_list = [] for data in page_data: #tongguo model_to_dict转换成dict,exclude过滤哪些字段 tmp_data = model_to_dict(data,exclude=['is_delete']) data_list.append(tmp_data) return JsonResponse({"code":0,"data":data_list}) elif requests.method == 'POST': # 通过form进行数据验证 form_obj = ParameterForm(requests.POST) #数据验证是否通过 if form_obj.is_valid(): models.Parameter.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是所有验证通过的数据 elif requests.method == 'PUT': # django并没有处理PUT的数据,实际上put传过来的数据在request.body # 需要导入 from django.http import QueryDict 来处理数据 put_data = QueryDict(requests.body) #获取需要更新哪天数据的主键 p_id = put_data.get('id') #通过id 从数据库中取这条数据 data_obj = models.Parameter.objects.get(id=p_id) #参数1是前端传过来的数据,参数2是数据库中获取的数据 form_obj = ParameterForm(put_data,instance=data_obj) if form_obj.is_valid(): # 通过form的save方法进行数据更新 form_obj.save() return JsonResponse({"code":200,"msg":"成功"}) else: return JsonResponse({"code":"500","msg":form_obj.errors.get_json_data()}) elif requests.method == 'DELETE': p_id = requests.GET.get('id') #删除时,要知道删除的是哪条数据,获取主键id #1-逻辑删除,改变字段状态 models.Parameter.objects.filter(id=p_id).update(is_delete=1) #这种方式不会触发updatetime #可以触发updatetime方式 obj = models.Parameter.objects.filter(id=p_id).first() obj.is_delete = 1 obj.save() #2-物理删除,直接将数据delete掉 models.Parameter.objects.filter(id=p_id).delete() return JsonResponse({"msg":"delete"}) else: return HttpResponse("errors")#models.py数据:from django.db import modelsclass BaseModel(models.Model): '''公共字段''' is_delete_choice = ( (1, '删除'), (0, '正常') ) is_delete = models.SmallIntegerField(choices=is_delete_choice, default=0, verbose_name='是否被删除') create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add的意思,插入数据的时候,自动取当前时间 update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) # 修改数据的时候,时间会自动变 class Meta: abstract = True # 只是用来继承的,不会创建这个表class Parameter(BaseModel): name = models.CharField(max_length=200, verbose_name='参数名', unique=True) desc = models.CharField(max_length=200, verbose_name='描述') value = models.CharField(max_length=200, verbose_name='参数值') def __str__(self): return self.name class Meta: # django admin verbose_name = '全局参数表' verbose_name_plural = verbose_name db_table = 'parameter' # 最后创建的在最上面 ordering = ['-id']#forms.py数据:from django import formsfrom django.forms import ModelFormfrom example import modelsclass ParameterForm(forms,ModelForm): class Meta: model = models.Parameter exclude = ['id','is_delete','update_time','create_time']
#CBV接口开发方式: class Base view,通过class 可以 用到继承 多继承 面向对像
#CBV的视图 class Parameter(View): def get(self,requests): # get请求时 获取传递过来的第几页数据 page = requests.GET.get('page') qs = models.Parameter.bojects.filter(is_delete=0) page_obj = Paginator(qs, 5) # 获取第几页的数据 page_data = page_obj.get_page(page) # 用于存储返回的dict类型数据 data_list = [] for data in page_data: # 通过 model_to_dict转换成dict,exclude过滤哪些字段 tmp_data = model_to_dict(data, exclude=['is_delete']) data_list.append(tmp_data) return JsonResponse({"code": 0, "data": data_list}) def post(self,requests): # 通过form进行数据验证 form_obj = ParameterForm(requests.POST) # 数据验证是否通过 if form_obj.is_valid(): models.Parameter.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是所有验证通过的数据 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 = models.Parameter.objects.get(id=p_id) # 参数1是前端传过来的数据,参数2是数据库中获取的数据 form_obj = ParameterForm(put_data, instance=data_obj) if form_obj.is_valid(): # 通过form的save方法进行数据更新 form_obj.save() return JsonResponse({"code": 200, "msg": "成功"}) else: return JsonResponse({"code": "500", "msg": form_obj.errors.get_json_data()}) def delete(self,requests): p_id = requests.GET.get('id') # 删除时,要知道删除的是哪条数据,获取主键id # 1-逻辑删除,改变字段状态 models.Parameter.objects.filter(id=p_id).update(is_delete=1) # 这种方式不会触发updatetime # 可以触发updatetime方式 obj = models.Parameter.objects.filter(id=p_id).first() obj.is_delete = 1 obj.save() # 2-物理删除,直接将数据delete掉 models.Parameter.objects.filter(id=p_id).delete() return JsonResponse({"msg": "delete"})