购物车ID是否应与用户ID绑定?

时间:2018-12-28 05:18:48

标签: django

我想创建一个与用户ID绑定的购物车应用。主要是因为如果用户注销,购物车中的物品将不会被删除。

这是我的第一个Django项目,所以我不能100%地确定这是否是一个好主意,因为我正在跟踪所有有关购物车使用过程的教程,因此如果有人可以给我一些反馈,那就太好了。

这是我的模型。py:

from django.db import models
from django.conf import settings

from menulistapp.models import menulist

User = settings.AUTH_USER_MODEL

class CartManager(models.Manager):
    def new_or_get(self, request):        
        try:
            cart_obj = Cart.objects.get(id=request.user.id)
            new_obj = False
        except Cart.DoesNotExist:
            new_obj = True
            cart_obj = Cart.objects.create(user=request.user)
            cart_obj.id = request.user.id

        return cart_obj

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ManyToManyField(menulist, blank=True)
    total = models.DecimalField(default=0.0, max_digits=10, decimal_places=1)
    updated = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)

这是我的观点:

def cart_home(request):
    template = "cartapp/home.html"
    cart_id = request.user.id
    cart_obj = Cart.objects.new_or_get(request)
    context = {       
        "x": request.user,
    }
    return render(request, template, context)

2 个答案:

答案 0 :(得分:1)

除了自定义管理器之外,我认为您对Model的实现看起来还不错。 Django Manager已经建立了get_or_create方法,与您的方法类似。您可以像这样使用它:

cart, created = Cart.objects.get_or_create(user=request.user)

,您应该这样更新视图:

from django.contrib.auth.decorators import login_required

@login_required
def cart_home(request):
    template = "cartapp/home.html"

    cart_obj, created = Cart.objects.get_or_create(user=request.user)
    context = {       
        "cart": cart_obj,  # you don't need to pass request.user because its already available in template via {{ user }}
    }

    return render(request, template, context)

答案 1 :(得分:1)

是的,您应该将购物车对象与用户绑定,因为:

  1. 即使用户注销或会话过期,您也永远不会丢失购物车。
  2. 您的企业仅支持每客户一个购物车模式。
  3. 如果用户有购物车中的商品但尚未签出,则可以通过电子邮件或其他渠道跟进用户。
  4. 出于分析目的,这也是一个好主意。您可以根据用户的喜好购买模式等。

这些是将购物车对象与用户绑定的一些基本原因。为了支持访客用户/匿名用户,您也可以将购物车与会话绑定。