博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue + Django 2.0.6 学习笔记11.5-9 商品点击数,收藏数,库存,销量的修改,drf缓存和redis缓存,throttle设置访问速度
阅读量:4126 次
发布时间:2019-05-25

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

商品点击数修改:

默认情况下 前端页面请求发送的参数中没有相应字段的话。后端mixins.RetrieveModelMixin类也不会额外增加请求参数之外的字段进行修改保存。所以 如果想要使后端自动增加点击数 就需要我们重写retrieve函数(该函数来源于mixins.RetrieveModelMixin类中)

goods/views.py/GoodsListViewset:    def retrieve(self, request, *args, **kwargs):# 手动的修改click_num字段        instance = self.get_object()        instance.click_num += 1        instance.save()        serializer = self.get_serializer(instance)        return Response(serializer.data)

 

商品收藏数修改

同样收餐数也是 当用户点击收藏的时候,后台操作的是UserFave表。而不会影响到Goods表。所以我们需要做个修改使Goods表也能记录到收藏数

# apps/user_operation/UserFavViewset    def perform_create(self, serializer):        instance = serializer.save()        goods = instance.goods        goods.fav_num += 1        goods.save()

这是一种方法,同时也可以用信号量的方式:

1. 在goods创建singals.py 

# encoding:utf-8from django.db.models.signals import post_savefrom django.dispatch import receiverfrom django.contrib.auth import get_user_modelfrom .models import UserFavUser = get_user_model()# 参数一,接收什么信号,接收哪个model的信号 也就是说信号来自哪里@receiver(post_save, sender=UserFav)def create_userfav(sender, instance=None, created=False, **kwargs):    if created:        goods = instance.goods        goods.fav_num += 1        goods.save()

取消收藏时也可以这么操作

# encoding:utf-8from django.db.models.signals import post_deletefrom django.dispatch import receiverfrom django.contrib.auth import get_user_modelfrom .models import UserFavUser = get_user_model()@receiver(post_delete, sender=UserFav)def delete_user(sender, instance=None, created=False, **kwargs):    goods = instance.goods    goods.fav_num -= 1    goods.save()

商品库存的修改

商品库存 教程里面使用简单的关联,即购物车数据的变化影响商品库存的变化

所以购物车新增商品,则商品库存就减少商品 。购物车减少商品, 商品库存就增加商品

操作都在trade/views.py/ShoppingCartViewset中进行的

先说第一个,购物车新增商品

class ShoppingCartViewset(viewsets.ModelViewSet):    def perform_create(self, serializer):        shop_cart = serializer.save()        goods = shop_cart.goods# 库存减掉购物车的商品数量即可        goods.goods_num -= shop_cart.nums        goods.save()

减少商品

def perform_destroy(self, instance):        goods = instance.goods        goods.goods_num += instance.nums        goods.save()# 要在delete()之前完成,否则无法找购物车中对应的商品        instance.delete()

修改

def perform_update(self, serializer):# 先拿到购物车中的数量        existed_record = ShoppingCart.objects.get(id=serializer.instance.id)        existed_nums = existed_record.nums# 在拿到新保存的购物车的数量        saved_record = serializer.save()# 比对之后即可获取相差的数量,然后去商品库存中计算(因为购物车和商品库存是相对的数值,所以取-=)        nums = saved_record.nums - existed_nums        goods = saved_record.goods        goods.goods_num -= nums        goods.save()

商品的销量: 使用支付成功与否来确定

// apps/trade/views.py/AliPayViewset/post            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)            for existed_order in existed_orders:# 主要是改这里 现货区订单中的商品                order_goods = existed_order.goods.all()# 然后迭代中所有的善品 增加购物车中的销售数量                for order_good in order_goods:                    goods = order_good.goods                    goods.sold_num += order_good.goods_num                    goods.save()

drf缓存

django自己本身有缓存机制。 不过教程中主要是说drf的缓存

所以接下来来说drf缓存吧, drf是使用一个drf-extensions的插件 它本质上也是对django的缓存进行扩展

先上github插件地址:

文档地址:

其他都不管,有兴趣自己去看,就看这里

这里面有简单的例子。我这里直接上

# settings.py# 设置缓存更新的时间节点REST_FRAMEWORK_EXTENSIONS = {    'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 15}# 在需要缓存的地方加上如下代码from rest_framework_extensions.cache.mixins import CacheResponseMixin# ---------------------> 这里 最好放在第一个来继承。class GoodsListViewset(CacheResponseMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):

缓存一般是用来处理公共展示的数据。 不涉及到修改数据的。

该方法有些问题。

1. 就是他是将数据保存至内存中。 服务重启之后他数据就丢失。

2. 不是所有的操作都是获取所有的goods商品,有些要加过滤,有些是不同的用户。

    不可能所有的查询都指向同一组数据。

3. 为了解决这些问题,可以使用redis数据库做缓存

 

redis:

安装django专用的redis插件

github:

文档:

根据文档的说明安装然后进行配置即可

# settings.pyCACHES = {    "default": {        "BACKEND": "django_redis.cache.RedisCache",# 有密码的话就在127前面加上密码 具体看redis教程(我没有哈哈哈哈)        "LOCATION": "redis://127.0.0.1:6379",        "OPTIONS": {            "CLIENT_CLASS": "django_redis.client.DefaultClient",        }    }}

redis会根据不同的查询条件建立不同的key存储

这样,相同的查询条件会得到相同的key值,从而取出相同的缓存值。

 

throttle设置访问速度

这是rest_framework自带的

地址:

用来防止爬虫频繁爬取网站造成服务器压力

使用方法:

# settings.pyREST_FRAMEWORK = {    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',    # 'PAGE_SIZE': 10    'DEFAULT_AUTHENTICATION_CLASSES': (            'rest_framework.authentication.BasicAuthentication',            'rest_framework.authentication.SessionAuthentication',            # 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',            # 'rest_framework.authentication.TokenAuthentication',        ),    # 这里这里------限速    'DEFAULT_THROTTLE_CLASSES': (# 匿名用户的限速(IP)        'rest_framework.throttling.AnonRateThrottle',# 已登录的用户的限速(token)        'rest_framework.throttling.UserRateThrottle'    ),# 限速条件(具体可看文档 )    'DEFAULT_THROTTLE_RATES': {        'anon': '100/day',        'user': '1000/day'    }}

views.py中:

# goods/views.py/class GoodsListViewsetfrom rest_framework.throttling import UserRateThrottle, AnonRateThrottleclass GoodsListViewset    throttle_classes = (UserRateThrottle, AnonRateThrottle)

这样就可以了。 

转载地址:http://wpepi.baihongyu.com/

你可能感兴趣的文章
LeetCode第44题思悟——通配符匹配(wildcard-matching)
查看>>
LeetCode第45题思悟——跳跃游戏(jump-game-ii)
查看>>
LeetCode第46题思悟——全排列(permutations)
查看>>
LeetCode第47题思悟—— 全排列 II(permutations-ii)
查看>>
LeetCode第48题思悟——旋转图像(rotate-image)
查看>>
驱动力3.0,动力全开~
查看>>
记CSDN访问量10万+
查看>>
Linux下Oracle数据库账户被锁:the account is locked问题的解决
查看>>
记CSDN访问20万+
查看>>
Windows 环境下Webstorm 2020.3 版本在右下角找不到Git分支切换部件的一种解决方法
查看>>
Electron-Vue项目中遇到fs.rm is not a function问题的解决过程
查看>>
飞机换乘次数最少问题的两种解决方案
查看>>
有向无回路图的理解
查看>>
设计模式中英文汇总分类
查看>>
WPF实现蜘蛛纸牌游戏
查看>>
单例模式
查看>>
工厂方法模式
查看>>
模板方法模式
查看>>
数据结构之队列、栈
查看>>
数据结构之树
查看>>