Database 在django中使用昵称存储匿名用户的优雅方式?

Database 在django中使用昵称存储匿名用户的优雅方式?,database,django,anonymous-users,Database,Django,Anonymous Users,我的django应用程序中有一个简单的Post模型: class Post(models.Model): category = models.CharField(max_length=10, choices=choices) message = models.CharField(max_length=500) user = models.ForeignKey(User, editable=False) 我想实现让匿名用户用昵称创建帖子的功能。不幸的是,django不允许

我的django应用程序中有一个简单的Post模型:

class Post(models.Model):
    category = models.CharField(max_length=10, choices=choices)
    message = models.CharField(max_length=500)
    user = models.ForeignKey(User, editable=False)
我想实现让匿名用户用昵称创建帖子的功能。不幸的是,django不允许您将AnonymousUser的实例保存为Post类的外键

我正在考虑在数据库中添加一个“虚拟”用户记录,该记录表示匿名用户(id=0,如果可能的话,也可以是负数),用于所有没有用户的帖子。如果存在,将使用一个可为空的名称字段来表示匿名用户的昵称


这个解决方案对我来说似乎有点老套。是否有更有效的解决方案?

如果用户是匿名用户,您可以将
blank=True
null=True
添加到
User
ForeignKey
,并将其设置为
None
。您只需要将昵称存储在某个位置。

如果您可以通过一些会话信息来识别新用户,您可以创建正常的用户帐户,可以说是形式上的,带有一个标志来识别他们为易失性的(这可能会导致一些定期维护清理)

如果在会话生存期内,用户确实想要注册,那么您可以重用您的用户帐户,并且用户可以将其所有数据保留在自己的帐户上

正如@slacy评论和@Dominique回答的那样;不要滚动自己的项目,而是查看现有项目,例如:


    • 未测试,但这有助于:
      我是Django的新手。一位朋友告诉我不要使用
      ForeignKey
      ,还说使用
      CharField
      可以
      ForeignKey
      比CharField慢,因为它对用户信息进行了一些检查。

      一旦用户为空,我还可以加入吗?这与django lazysignup使用的方法相同,我建议使用它,而不是自己滚动。注意,因为你将有临时用户、爬虫和其他各种随机的东西创建(可能)永远不会消失的用户帐户。django Lazyingup处理得很好。