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"})

  

 

posted @ 2020-09-28 13:31  鲨鱼辣椒′  阅读(173)  评论(0编辑  收藏  举报