重写方法合集

一、视图集重写create

1 判断前端信息 避免重复添加

(1) 反序列化添加数据

需要添加的数据量多时使用

    # 避免重复添加的问题
    def create(self, request, *args, **kwargs):
        c_name = request.data.get('name')
        c_coupon_type = request.data.get('coupon_type')
        num = Coupon.objects.filter(name=c_name, coupon_type_id=c_coupon_type).count()
        if num > 0:
            return Response({'msg': '该优惠券已经添加过'}, status=400)
        else:
            # 反序列化添加数据
            ser = self.get_serializer(data=request.data)
            ser.is_valid()
            ser.save()

            return Response({'msg': '添加成功'}, status=201)

(2) 普通添加数据

适合数据量少的情况

    # 不允许重复添加
    def create(self, request, *args, **kwargs, ):
        name = request.data.get('value')
        spec = request.data.get('spec')

        # print('$$$$$$$ 获取对象->', name, '$$$$$$$ 类型->', type(name),)
        num = SpecOption.objects.filter(value=name).count()
        if num > 0:
            return Response({'msg': "重复添加", 'status': 400})
        else:
            SpecOption.objects.create(value=name, spec_id=spec)
            return Response({'msg': "添加成功", 'status': 201})

2 序列化器校验 增加时,判断信息是否包含xx

    #SPU的增加 增加时,注意判断SPU名字是否包含小米,
    def validate_name(self, name):
        if '小米' in name:
            return name
        else:
            raise ValidationError('SPU名字不包含小米,添加失败')

二、destroy

1 只允许删除 包含 xx 的SPU

    # SPU的删除,只允许删除名称包含 小米电视 的SPU
    def destroy(self, request, *args, **kwargs):
        spu = self.get_object()
        print('xxxxxxxxxx>>>>>>>', spu,'xxxxxxxxxx>>>>>>>', type(spu), spu.name)
        name = spu.name
        if '小米电视' in name:
            SPU.objects.get(name=name).delete()
            return Response({'msg': '删除成功', 'status': 201})
        return Response({'msg': '名称不包含小米电视,删除失败', 'status': 400})

2 只允许删除 外键字段包含 xx 的

    # 只允许删除spu的名字中有小米字样的规格;
    def destroy(self, request, *args, **kwargs):
        spec = self.get_object()
        print('xxxxxxxxxx>>>>>>>', spec,'xxxxxxxxxx>>>>>>>', type(spec), spec.spu, spec.name, spec.id)

        if '小米' in spec.spu.name:
            idq = spec.id
            SpuSpecification.objects.get(id=idq).delete()
            return Response({'msg': '删除成功', 'status': 201})
        return Response({'msg': '名称不包含小米电视,删除失败', 'status': 400})

三、update

1 只修改xx字段包含数值的

    # 只允许修改包含数值的规格值!如"铝合金"就不允许修改, 而"181g"就允许修改。
    def update(self, request, *args, **kwargs):
        option = self.get_object()
        value = option.value
        n_value = request.data.get('value')
        n_spec = request.data.get('spec')
        num_in = re.search(r'\d', value)
        if num_in:
            option.value = n_value
            option.spec_id = n_spec
            option.save()
            return Response({'msg': "包含数值,修改成功"}, status=201)
        else:
            return Response({'msg': "不包含数值,修改失败"}, status=400)

2 前端提交修改时,反序列化入库的字段加上其他信息

    # SPU修改  前端提交修改时,反序列化入库时,SPU的名字后面加上自己名字,
    # 比如 小米10,反序列化入库为 小米10_jack修改。
    def update(self, request, *args, **kwargs):
        spu = self.get_object()
        # print('xxxxxxx>>>>>>', spu, type(spu), '<<<<<', spu.desc_detail)
        name = request.data.get('name')
        spu.name = name+'_luoting修改'
        spu.brand_id = request.data.get('brand')
        spu.category1_id = request.data.get('category1')
        spu.category2_id = request.data.get('category2')
        spu.category3_id = request.data.get('category3')
        spu.desc_detail = request.data.get('desc_detail')
        spu.desc_pack = request.data.get('desc_pack')
        spu.desc_service = request.data.get('desc_service')
        spu.brand_name = request.data.get('brand_name')
        spu.save()
        return Response({'status': 200, 'message': 'SPU修改成功'})

3 修改简洁流程

    # 重写update
    def update(self, request, *args, **kwargs):
        # 1 接手前端数据
        status = request.data.get('status')
        # 2 获取要更新的对象
        order = self.get_object()
        # 3 更新状态
        order.status = status
        order.save()
        return Response({'code':200, 'msg': '更新状态成功'})

四 list

1 展示子类

# 获取子分类 2,3  channel/categories/
class SubsCate(ListAPIView):
    queryset = Cate.objects.all()
    serializer_class = Cate_Serializer
    lookup_field = 'pk'
    def list(self, request, *args, **kwargs):
        cate_subs = self.get_object().subs.all()  #  对象.subs.all() 模型类定义的反向查询方法
        ser = Cate_Serializer(cate_subs, many=True)
        return Response(ser.data)

五 retrieve

1 返回要求的json数据

    # 重写retrieve检索 返回要求的json数据
    def retrieve(self, request, *args, **kwargs):
        order = self.get_object()
        order_ser = OrderInfo_Serializer(order)

        order_goods = order.orderGoods.all()
        order_goods_ser = OrderGood_Serializer(order_goods, many=True)
        temp = []
        for i in order_goods_ser.data:
            i['sku'] = Good_Serializer(Good.objects.filter(id=i.get('sku')).first()).data
            # 存入一个临时列表
            temp.append(i)

        order_dict = order_ser.data
        order_dict['skus'] = temp
        return Response(order_dict)

六 涉及用户的 添加修改 需要加密

文章链接
http://t.csdn.cn/JdqI5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值