为匿名用户提供与已注册用户相同的功能

Adr*_*ter 6 python django session

我正在Django的一个在线商店(现在只是一个基本的购物车),我打算为用户添加功能,将项目标记为收藏(就像在stackoverflow中一样).购物车的型号如下所示:

class Cart(models.Model):
    user = models.OneToOneField(User)

class CartItem(models.Model):
    cart = models.ForeignKey(Cart)
    product = models.ForeignKey(Product, verbose_name="produs")
Run Code Online (Sandbox Code Playgroud)

收藏夹模型只是一个包含两行的表:用户和产品.

问题是这只适用于注册用户,因为我需要一个用户对象.如何让未注册的用户使用这些功能,将数据保存在cookie /会话中,以及何时以及如果他们决定注册,将数据移动到他们的用户?

我猜一种选择是某种通用关系,但我认为这有点复杂.也许在用户之后有一个额外的行是一个会话对象(我到目前为止还没有在django中真正使用过会话),如果User设置为None,那么使用它?

所以基本上,我想问的是,如果你之前遇到过这个问题,你是如何解决的,最好的方法是什么?

Dav*_*ebb 9

我之前没有这样做,但是从阅读你的描述中我只会在有人需要做某些需要它的事情时创建一个用户对象.然后,您向用户发送链接到此用户对象的cookie,因此如果有人回来(不清除他们的cookie),他们将获得相同的骨架用户对象.

这意味着您可以使用最少的更改来使用当前代码,并且当他们想要迁移到完整注册用户时,您可以使用其详细信息填充框架用户对象.

如果您希望保持数据库整洁,您可以添加一个任务,删除过去30天内未使用过的所有骨架用户.

  • IP地址不能用作唯一密钥.想想防火墙NAT背后的多个用户. (4认同)

tgh*_*ghw 6

在我看来,最简单的方法是存储用户 ID 或会话 ID:

class Cart(models.Model):
    user = models.ForeignKey(User, null=True)
    session = models.CharField(max_length=32, null=True)
Run Code Online (Sandbox Code Playgroud)

然后,当用户注册时,您可以获取他们的request.session.session_key用户 ID 并使用他们的新用户 ID 更新所有行。

更好的是,您可以定义一个“ UserProxy”模型:

class Cart(models.Model):
    user = models.ForeignKey(UserProxy)

class UserProxy(models.Model):
    user = models.ForeignKey(User, unique=True, null=True)
    session = models.CharField(max_length=32, null=True)
Run Code Online (Sandbox Code Playgroud)

因此,您只需在用户注册时更新 UserProxy 表,而无需更改有关购物车的任何内容。