美多商城用戶瀏覽歷史記錄總結

用戶瀏覽歷史記錄

  • 我們將瀏覽數據存儲在redis中, 存儲的數據形式如下

    'history_%s' % user.id: [sku_id, sku_id, ...]
    
  • 當瀏覽頁面詳情頁時, 前端發送sku_id給後端, 後端通過user_id儲存在redis中

    # 視圖如下,post方法滿足要求
    class UserHistory(CreateAPIView):
        serializer_class = UserHistorySerializer
        
    #序列化器重寫create方法
    class UserHistorySerializer(serializer.Serializer):
        # 增加顯示指明字段
        sku_id=serializer.IntegerField(min_value=1)
        def validate(self,attrs):
            try:
                sku=SKU.objects.get(id=attrs['sku_id'])
            except:
                return Response({'error':'數據不存在'})
            return attrs
        def create(self,attrs):
            user = self.context.get('request').user
            conn = get_redis_connection('history')
            sku_id=attrs['skud_id']
            # 首先刪除列表裏的陳舊數據
            conn.lrem('history_%s'%user.id,0,sku_id)
            # 增加新的數據
            conn.lpush('history_%s'%user.id,0,sku_id)
            # 設置數據保存上限
            conn.ltrim('history_%s'%user.id,0,10)
            # 沒有對象返回字典對象
            return attrs
    
  • 在用戶中心頁面, 前端發送GET /browse_histories/ 請求, 後端返回sku數據

    # 前端發送請求後, 後端根據user_id從數據庫找出上面存儲的sku_id列表, 然後序列化返回對象數據就行了
    # 對上面的視圖進行修改使用
    class UserHistory(ListCreateAPIView):
        def get_serilizer_class(self):
            if self.request.method=='GET':
                return UserHistorySerializer
            else:
                return SkuSerializer
    	# 對查詢集做修改
        def get_queryset(self):
            conn = get_redis_connection('history')
            user=self.request.user
            sku_list=conn.lrange('history_%s'%user.id,0,10)
            skus=SKU.objects.filter(id__in=sku_list)
            return skus
    
    class SkuSerializer(serializer.Serializer):
        model=SKU
        fields=("id","name","price","default_image_url","comments")
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章