python学习之美多商城(十九):商品部分:用户浏览历史记录

一、用户浏览历史记录:

用户在访问每个商品详情页面时,都要记录浏览记录。
历史记录只需要保存多个商品的sku_id即可, 而且需要保持添加sku_id的顺序, 所以采用redis中列表来保存,redis的数据存储设计。

'history_用户id': [sku_id,]

在配置文件中增加浏览历史记录的redis配置

# meiduo_mall/settings/dev.py
# 配置redis
CACHES = {
    ...
    "history":{
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/3",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

1.保存:

请求方式: POST  /browse_histories/
请求参数: JSON或表单

参数类型是否必须说明
sku_idstr商品sku的编号

返回数据: JSON

返回值类型是否必须说明
sku_idstr商品sku的编号

后端实现:
在goods/views.py中实现视图类:

# meiduo_mall/apps/goods/views.py

...
class SKUHistoryView(CreateAPIView):
    """ 保存用户历史浏览记录 """
    serializer_class = SKUHisrotySerializer

在goods/serializers.py中实现序列化器

# meiduo_mall/apps/goods/serializers.py

...
class SKUHisrotySerializer(serializers.Serializer):
    """用户历史浏览记录序列化器"""
    sku_id = serializers.IntegerField(label="sku编号", min_value=1)
    
    def validated(self, attrs):
        """
        判断sku_id是否存在
        :param attrs: 
        :return: 
        """
        try:
            SKU.objects.get(id = attrs["sku_id"])
        except:
            raise serializers.ValidationError("商品不存在")
        return attrs
    
    def create(self, validated_data):
        """
        保存浏览历史数据到redis中
        1.建立redis链接
        2.判断sku_id是否保存过
        3.保存错,删除;没保存过,写入sku_id
        4.控制保存数量
        5.返回结果
        :param validated_data: 
        :return: 
        """
        
        # 1.建立连接
        conn = get_redis_connection('history')
        user = self.context['request'].user
        # 2.判断是否保存过
        conn.lrem("history_{}".format(user.id), 0,validated_data['sku_id'])
        # 3.写入
        conn.lpush("history_{}".format(user.id), validated_data['sku_id'])
        # 4.控制保存数量
        conn.ltrim("history_{}".format(user.id), 0, 6)
        # 5.返回
        return validated_data

绑定路由: 在goods/urls.py中添加路由

2.查看:

请求方式: GET  /browse_histories/
请求参数:
**返回数据:**JSON

返回值类型是否必须说明
idint商品sku 编号
namestr商品名称
pricedecimal单价
default_image_urlstr默认图片
commentsint评论量
[
    {
        "id": 14,
        "name": "华为 HUAWEI P10 Plus 6GB+128GB 玫瑰金 移动联通电信4G手机 双卡双待",
        "price": "3788.00",
        "default_image_url": "http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRdMSAaDUtAAVslh9vkK04466364",
        "comments": 1
    },
    {
        "id": 16,
        "name": "华为 HUAWEI P10 Plus 6GB+128GB 曜石黑 移动联通电信4G手机 双卡双待",
        "price": "3788.00",
        "default_image_url": "http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRdPeAXNDMAAYJrpessGQ9777651",
        "comments": 0
    }
]

后端实现:
在goods/views.py中SKUHistoryView中补充get方式

# meiduo_mall/apps/goods/views.py

...
class SKUHistoryView(CreateAPIView):
...
class SKUHistoryView(CreateAPIView):
    """ 保存用户历史浏览记录 """
   ...

    def get(self, request):
        """
        获取用户浏览记录
        :param request:
        :return:
        """
        user_id = request.user.id

        redis_conn = get_redis_connection('history')
        history = redis_conn.lrange("history_{}".format(user_id),0, 10)

        skus = []

        # 为了保持查询出的用户浏览的顺序一致
        for sku_id in history:
            sku = SKU.objects.get(id = sku_id)
            skus.append(sku)

        s = SKUSerializer(skus, many=True)
        return Response(s.data)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅弋、璃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值