关于完成生鲜电商项目后的一点总结

如下内容是我关于完成生鲜电商项目后的一点总结,可能只有作完这个项目的人可能勉强看得懂一点,固然更可能是可能就只有我知道本身写的什么鬼了....(笑)前端

这一点的感想主要是,在什么状况下重载CreateModelMixin里面的create()方法和perform_create()方法(这里只以CreateModelMixin举例,其余例如RetrieveModelMixin等差很少),何时重载Serializer里面的create()方法,还有validate()的用法。数据库

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

 

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

①用户注册时,在经过前面各类验证以后,使用“ 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字段。spa

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

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

 

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

 

2、接下来介绍重载Serializer的create()方法的状况。orm

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

# 密码加密保存
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()。

 

3、介绍重载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()方法。

 

 4、重载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方法来接收刚刚保存的记录,提取里面的值进行额外操做。

相关文章
相关标签/搜索