匿名用户的外键

gue*_*tli 3 django django-models

我想遵循此准则并避免使用可为空的外键。

我有一个 django 用户模型的外键。

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

ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser>>":
 "MyModel.user" must be a "User" instance.
Run Code Online (Sandbox Code Playgroud)

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

我怎么能解决这个问题?

sch*_*ngt 6

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

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

关于评论:

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

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