一、首页商品类别显示
1.增加首页商品类别广告的model
2.xadmin显示
3.注册到xadmin中
4.views的实现
class IndexCategoryViewset(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
首页商品分类数据
"""
queryset = GoodsCategory.objects.filter(is_tab=True, name__in=["生鲜食品", "酒水饮料"])
serializer_class = IndexCategorySerializer
在xadmin后台手动增加brannds的图片数据
serializer进行嵌套时不会自动返回域名,需要进行配置,在嵌套的Serializer中添加一个参数。
如下:
二、商品点击数,收藏数的修改
1.进行方法的重载retrieve的重载来实现点击数的修改
class GoodsListViewSet(CacheResponseMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
商品列表页, 分页, 搜索, 过滤, 排序
"""
# throttle_classes = (UserRateThrottle, )
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
# authentication_classes = (TokenAuthentication, )
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = GoodsFilter
search_fields = ('name', 'goods_brief', 'goods_desc')
ordering_fields = ('sold_num', 'shop_price')
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.click_num += 1
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)
2.进行方法的重写perform_create来实现,收藏数的修改(也可以使用信号量进行修改)
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
mixins.DestroyModelMixin, viewsets.GenericViewSet):
"""
list:
获取用户收藏列表
retrieve:
判断某个商品是否已经收藏
create:
收藏商品
"""
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)#验证必须要登录
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)#token验证
lookup_field = "goods_id"#根据goods_id来寻找
def get_queryset(self):
return UserFav.objects.filter(user=self.request.user)
def perform_create(self, serializer):
instance = serializer.save()
goods = instance.goods
goods.fav_num += 1
goods.save()
def get_serializer_class(self):
if self.action == "list":
return UserFavDetailSerializer
elif self.action == "create":
return UserFavSerializer
return UserFavSerializer
3.库存和销量的修改,主要是进行方法的重写
class ShoppingCartViewset(viewsets.ModelViewSet):
"""
购物车功能
list:
获取购物车详情
create:
加入购物车
delete:
删除购物记录
"""
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
#serializer_class = ShopCartSerializer
lookup_field = "goods_id"
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()
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()
def get_serializer_class(self):
if self.action == 'list':
return ShopCartDetailSerializer
else:
return ShopCartSerializer
def get_queryset(self):
return ShoppingCart.objects.filter(user=self.request.user)
4.商品销量修改
class AliPayView(APIView):
def get(self, request):
# 与post类似
def post(self, request):
"""
处理支付宝notify_url异步通知
:param request:
:return:
"""
processed_dict = {}
for key, value in request.POST.items():
processed_dict[key] = value
print('request.POST的值:', processed_dict)
sign = processed_dict.pop('sign', None) # 直接就是字符串了
server_ip = get_server_ip()
alipay = AliPay(
app_id=app_id, # 自己支付宝沙箱 APP ID
notify_url="http://{}:8000/alipay/return/".format(server_ip),
app_private_key_path=app_private_key_path, # 可以使用相对路径那个
alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
debug=alipay_debug, # 默认False,
return_url="http://{}:8000/alipay/return/".format(server_ip)
)
verify_result = alipay.verify(processed_dict, sign) # 验证签名,如果成功返回True
if verify_result:
order_sn = processed_dict.get('out_trade_no') # 原支付请求的商户订单号
trade_no = processed_dict.get('trade_no') # 支付宝交易凭证号
trade_status = processed_dict.get('trade_status') # 交易目前所处的状态
# 更新数据库订单状态
"""
OrderInfo.objects.filter(order_sn=order_sn).update(
trade_no=trade_no, # 更改交易号
pay_status=trade_status, # 更改支付状态
pay_time=timezone.now() # 更改支付时间
)
"""
orderinfos = OrderInfo.objects.filter(order_sn=order_sn)
for orderinfo in orderinfos:
orderinfo.trade_no = trade_no, # 更改交易号
orderinfo.pay_status = trade_status, # 更改支付状态
orderinfo.pay_time = timezone.now() # 更改支付时间
# 更改商品的销量
order_goods = orderinfo.order_goods.all()
for item in order_goods:
# 获取订单中商品和商品数量,然后将商品的销量进行增加
goods = item.goods
goods.sold_num += item.goods_nums
goods.save()
orderinfo.save()
# 给支付宝返回一个消息,证明已收到异步通知
# 当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效。
# 也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出 success 导致支付宝重发数次通知),服务器异步通知参数 notify_id 是不变的。
return Response('success')