Django:匿名会话和 "temporary" 一对一相关模型?

Django: Anonymous session & "temporary" one-to-one related model?

目前,我有一个 Cart 模型,每个注册 CustomUser(一对一关系):

class Cart(models.Model):
    created_at = models.DateTimeField(auto_now_add = True)
    user = models.OneToOneField(CustomUser, related_name='cart')

但是现在我对匿名用户(来宾)有一些要求。看了一些文章,好像需要session?

  1. 简单的基于数据库的会话。
  2. 如何让客人在他们需要时拥有相关的临时GuestCart模型
    • 因为我不希望连机器人都有推车浪费资源
    • 那么...我可以GuestCart.objects.create(session = request.session['cart']) #just pseudo-code, I don't sure how to do this 当访客调用视图时吗?
  3. GuestCart 将活整 1 周(从 GuestCart 开始计算 已建立 。客人的 activity 时间不会更新),并且应该在过期时自动删除。

** 更新 @ 2015/3/21:目前,我在 request.session 中添加了一个新密钥 cart_id,并且没有将会话信息保存到数据库中。

为了支持匿名用户,我相信您的 Cart 模型 class 应该是这样的;

class Cart(models.Model):
    created_at = models.DateTimeField(auto_now_add = True)
    user = models.OneToOneField(CustomUser, blank=True, null=True, related_name='cart')
    session_key = models.CharField(max_length=40)

  class Meta:
    unique_together = ('user', 'session_key',)

然后你可以像这样检索用户购物车:

if request.user.is_authenticated():
    cart, created = Cart.objects.update_or_create(
        user = request.user,
        defaults = {'session_key': request.session.session_key}
    )
else:
    cart, created = Cart.objects.get_or_create(
        session_key = request.session.session_key,
        defaults = {'user': None}
    )

以后如果结账​​过程需要注册,您可以随时更改购物车并添加用户。