django - 匿名用户的外键
问题描述
我想遵循这个准则并避免可以为空的 ForeignKey。
我有一个 django User 模型的 ForeignKey。
如果我尝试将 request.user 存储在此模型的实例中,则会收到此错误:
ValueError: Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser>>":
"MyModel.user" must be a "User" instance.
我认为避免非无条件数据模式(可为空的外键)是可行的。
我怎么能解决这个问题?
解决方案
这些指南建议您创建一个反映匿名用户的用户实例。否则称为哨兵值。您必须通过一些唯一键(可能是用户名)来跟踪它。然后确保它存在并且没有其他人实际使用该密钥创建用户,否则您会遇到其他问题。
但是,由于上述概述的问题,我不同意这些指导方针。如果您的数据模型允许可选关系,那么您绝对应该使用 NULL 值。
关于评论:
如果您的数据中没有 NULL,那么在处理数据时,您的源代码中将不会出现 NullPointerException :-)
仅仅因为没有 NULL 字段,并不意味着这些条件不存在。您仍在处理这些边缘情况,但更改名称和一些语法。您仍然容易受到错误的影响,因为您仍然有很多条件(并且可能更多,因为您现在必须确保您的哨兵值是唯一的)。
推荐阅读
- jquery - 单击时如何将折叠按钮移至底部?
- javascript - 模态组件内的工具提示定位
- android - 为什么 Braintree 支付插件不起作用?
- karate - 空手道:试图让全局标题工作
- mysql - 计算两个查询的平均值
- windows - Wingdings 字体,某些字符未正确显示。显示为框
- python - 如何从请求中解析xml?
- mapbox - Mapbox GL-JS:在标签下添加新的瓦片集覆盖
- django - How to make models of app available to other apps in a django project?
- javascript - Vue js、Axios、甲骨文。如何使用一个 blob 字段从 db 加载 ref 游标?