博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于完成生鲜电商项目后的一点总结
阅读量:5739 次
发布时间:2019-06-18

本文共 3969 字,大约阅读时间需要 13 分钟。

以下内容是我关于完成生鲜电商项目后的一点总结,可能只有做完这个项目的人可能勉强看得懂一点,当然更多是可能就只有我知道自己写的什么鬼了....(笑)

这一点的感想主要是,在什么情况下重载CreateModelMixin里面的create()方法和perform_create()方法(这里只以CreateModelMixin举例,其他例如RetrieveModelMixin等差不多),什么时候重载Serializer里面的create()方法,还有validate()的用法。

通过对这个项目中用到这种方法的总结,大概里面有8个地方用到了上面所说的方法。

 

一、首先是validate()的用法,出现的地方有:

①用户注册时,在通过前面各种验证之后,使用“ attrs["mobile"] = attrs["username"] ”,创建一个键值对,把前端传过来的手机号码保存起来,这里的"mobile"是与用户表中的字段保持一致。然后用“ del attrs["code"] ”删除验证码。

def validate(self, attrs):        # 前端没有传mobile值到后端,这里添加进来        attrs["mobile"] = attrs["username"]        # code是自己添加得,数据库中并没有这个字段,验证完就删除掉        del attrs["code"]        return attrs
View Code

 

对这段的分析,就是用户在前端传过来三个数据(username,password,code),然后在CreateModelMixin里面把这些数据交给我们自定义的serializer进行验证,验证成功后,本来下一步就是调用perform_create()进行保存,可是因为我们设计的表中有mobile字段,且没有code字段,所以就在前一步,也就是验证成功后到调用perform_create()之前,添加mobile字段,删除多余的code字段。

②在订单管理接口时,在validate()中添加自动生成的订单号。

def validate(self, attrs):        # validate中添加order_sn,然后在view中就可以save        attrs["order_sn"] = self.generate_order_sn()        return attrs
View Code

 

综上所述,可以知道,validate()的一个作用,就是提交上来的数据验证成功后,在保存到数据库之前,根据设计的表的需要对要进行保存的数据进行其他必要的操作。(增删等)

 

二、接下来介绍重载Serializer的create()方法的情况。

①对密码进行加密保存。Serialzier的create()本来就是数据验证(is_valid)通过后,CreateModelMixin调用perform_create(),然后里面的.save()方法调用Serializer的create()方法把数据自动保存到数据库中(当然,这里的前提是继承ModelSerializer)。重载Serializer的create(),意味着要我们自己去写保存数据的逻辑,不过项目中用了另一种做法避免了自己写保存逻辑。

# 密码加密保存def create(self, validated_data):        user = super(UserRegSerializer, self).create(validated_data=validated_data)        user.set_password(validated_data["password"])        user.save()        return user
View Code

 

②添加商品到购物车时,由于继承是Serializer而不是ModelSerializer,所以需要重载create()

def create(self, validated_data):        user = self.context["request"].user        nums = validated_data["nums"]        goods = validated_data["goods"]        existed = ShoppingCart.objects.filter(user=user, goods=goods)        if existed:            existed = existed[0]            existed.nums += nums            existed.save()        else:            existed = ShoppingCart.objects.create(**validated_data)
View Code

 

综上所述,重载Serializer的情况有:①继承Serializer的时候需要我们重载;②继承ModelSerializer的时候,如果对保存到数据库的数据需要进行额外的操作,可以重载Serializer的create()。

 

三、介绍重载CreateModelMixin的create()(或者说成ModelViewset's create())的情况。

①把用户生成的token加载到头部header中时,重载CreateModelMixin的create()。这样才可以用到里面的添加信息到header的操作。

def create(self, request, *args, **kwargs):        serializer = self.get_serializer(data=request.data)        serializer.is_valid(raise_exception=True)        user = self.perform_create(serializer)        re_dict = serializer.data        payload = jwt_payload_handler(user)        re_dict["token"] = jwt_encode_handler(payload)        re_dict["name"] = user.name if user.name else user.username        headers = self.get_success_headers(serializer.data)        return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
View Code

 

综上所述,如果要把信息添加到header里面,就重载CreateModelMixin的create()方法。

 

 四、重载perform_create()方法。

①创建订单后,重载perform_create(),实例化"order = serializer.save()",把购物车的商品和订单order一起添加到订单的商品详情表中。

def perform_create(self, serializer):        order = serializer.save()        shop_carts = ShoppingCart.objects.filter(user=self.request.user)        for shop_cart in shop_carts:            order_goods = OrderGoods()            order_goods.goods = shop_cart.goods            order_goods.goods_num = shop_cart.nums            order_goods.order = order            order_goods.save()            # 清空购物车            shop_cart.delete()        return order
View Code

 

②用户添加收藏,实例化收藏记录"instance = serializer.save()",然后通过“goods = instance.goods”获取到商品,对它的goods.fav_nums += 1。

def perform_create(self, serializer):        instance = serializer.save()        goods = instance.goods        goods.fav_num += 1        goods.save()
View Code

 

综上所述,重载perform_create()的情况有,如果需要利用到保存后的数据,例如购物车的商品以及数量,来减去库存里的,这里就可以重写perfrom_create方法来接收刚刚保存的记录,提取里面的值进行额外操作。

 

 

转载于:https://www.cnblogs.com/linyuhong/p/9965786.html

你可能感兴趣的文章
Windows UI风格的设计(7)
查看>>
SQL中使用WITH AS提高性能 使用公用表表达式(CTE)简化嵌套SQL
查看>>
oracle 强行杀掉一个用户连接
查看>>
Git提交本地库代码到远程服务器的操作
查看>>
让你快速上手的Glide4.x教程
查看>>
浮动和清除(闭合)浮动
查看>>
LR录制脚本时IE打不开的原因
查看>>
微博自动化测试
查看>>
Sublime Text 2.0.2,Build 2221注册码
查看>>
js scroll事件
查看>>
最长递增子序列 动态规划
查看>>
原生CSS设置网站主题色—CSS变量赋值
查看>>
webpack 4.0 中 clean-webpack-plugin 的使用
查看>>
WPF
查看>>
中文词频统计
查看>>
POJ 2236 Wireless Network (并查集)
查看>>
python分类
查看>>
GitBlit (1)-- 在linux 安装 GitBlit 并运行
查看>>
Windows与Linux之间的文件自动同步
查看>>
程序是如何执行的(一)a=a+1
查看>>