服务.py
def add_goods_to_cart(goods_id, user, addend):
goods = Goods.objects.filter(pk=goods_id).first()
if goods:
the_goods_already_in_cart = Cart.objects.filter(user=user, goods=goods, order=None).first()
if the_goods_already_in_cart:
the_goods_already_in_cart.quantity = (the_goods_already_in_cart.quantity + addend)
if the_goods_already_in_cart.quantity == 0:
the_goods_already_in_cart.delete()
else:
the_goods_already_in_cart.save()
else:
Cart.objects.create(user=user, goods=goods, quantity=1)
status = 200
else:
status = 400
return status
views.py
class AddToCart(LoginRequiredMixin,
View):
def post(self, request):
goods_id = request.POST.get('goods_id')
addend = int(request.POST.get('addend'))
assert (addend == 1 or addend == -1)
status = add_goods_to_cart(goods_id, request.user, addend)
if status == 200:
act = "added to cart" if addend > 0 else "removed from cart"
messages.add_message(request, messages.INFO, 'Goods "{}" {}.'.format(goods.name, act))
return redirect(request.META['HTTP_REFERER'])
else:
return HttpResponse("Wrong goods id", status=status)
令我困扰的是:
好吧,无论如何,这段代码的架构很糟糕。也许我应该从服务返回的不是状态代码,而是添加的商品的名称?
如何重构这段代码?
您不必在 service.py 中返回状态代码来了解其中发生的情况,还有一种更简单的方法可以返回商品的名称和 service.py 中发生的情况的标志,只需返回商品的名称,如果它存在,如果不存在则不存在。这样您就可以在视图中处理状态代码,并且您还可以知道该商品的名称:
goods = Goods.objects.filter(pk=goods_id).first()
if goods:
the_goods_already_in_cart = Cart.objects.filter(user=user, goods=goods, order=None).first()
if the_goods_already_in_cart:
the_goods_already_in_cart.quantity = (the_goods_already_in_cart.quantity + addend)
if the_goods_already_in_cart.quantity == 0:
the_goods_already_in_cart.delete()
else:
the_goods_already_in_cart.save()
else:
Cart.objects.create(user=user, goods=goods, quantity=1)
return goods.name # Return the name of the added goods
return None # This shows that goods were not found