zoukankan      html  css  js  c++  java
  • 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"})
    

      

  • 相关阅读:
    vsphere client cd/dvd 驱动器1 正在连接
    使用SecureCRT上传和下载文件
    java android 将 List中元素互换位置
    java中Math常用方法
    关于View转化成bitmap保存成图片
    Java中Math类的几个四舍五入方法的区别
    Math.round(),Math.ceil(),Math.floor()的区别
    动态的添加ImageView到LinearLayout中并居中显示
    android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)
    Android 代码设置RelativeLayout元素居中
  • 原文地址:https://www.cnblogs.com/csxyg/p/13744270.html
Copyright © 2011-2022 走看看