首页 > 解决方案 > 匿名用户的外键

问题描述

我想遵循这个准则并避免可以为空的 ForeignKey。

我有一个 django User 模型的 ForeignKey。

如果我尝试将 request.user 存储在此模型的实例中,则会收到此错误:

ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser>>":
 "MyModel.user" must be a "User" instance.

我认为避免非无条件数据模式(可为空的外键)是可行的。

我怎么能解决这个问题?

标签: djangodjango-models

解决方案


这些指南建议您创建一个反映匿名用户的用户实例。否则称为哨兵值。您必须通过一些唯一键(可能是用户名)来跟踪它。然后确保它存在并且没有其他人实际使用该密钥创建用户,否则您会遇到其他问题。

但是,由于上述概述的问题,我不同意这些指导方针。如果您的数据模型允许可选关系,那么您绝对应该使用 NULL 值。

关于评论:

如果您的数据中没有 NULL,那么在处理数据时,您的源代码中将不会出现 NullPointerException :-)

仅仅因为没有 NULL 字段,并不意味着这些条件不存在。您仍在处理这些边缘情况,但更改名称和一些语法。您仍然容易受到错误的影响,因为您仍然有很多条件(并且可能更多,因为您现在必须确保您的哨兵值是唯一的)。


推荐阅读