【发布时间】:2011-10-21 06:03:13
【问题描述】:
当删除开始起作用时,我对 OneToOneField 的工作方式有点困惑。我能找到的唯一准权威信息来自this thread on django-developers:
我不知道你是否发现了这个,但删除正在运行 一个方向,但不是你期望的方向。为了 例如,使用您在另一条消息中发布的模型:
class Place(models.Model): name = models.CharField(max_length = 100) class Restaurant(models.Model): place = models.OneToOneField(Place, primary_key=True)如果你 创建一个地方和与其链接的餐厅,删除 餐厅不会删除 Place(这是您遇到的问题 在此处报告),但删除地方会删除餐厅。
我有以下型号:
class Person(models.Model):
name = models.CharField(max_length=50)
# ... etc ...
user = models.OneToOneField(User, related_name="person", null=True, blank=True)
以这种方式设置,因此我可以使用 user.person 从 User 实例轻松访问 person。
但是,当我尝试在 admin 中删除 User 记录时,它自然会向后级联到我的 Person 模型,正如线程所讨论的那样,显示以下内容:
您确定要删除用户“JordanReiter2”吗?以下所有相关项目将被删除:
- 用户:JordanReiter
- 人:JordanReiter
- 提交:Title1
- 提交:Title2
- 人:JordanReiter
不用说我确实不想要删除Person 记录或其任何后代!
我想我理解其中的逻辑:因为在 Person 记录的 OneToOne 字段中有一个值,所以删除 User 记录会在数据库的 user_id 列中创建一个错误的引用。
通常,解决方案是切换OneToOne 字段所在的位置。当然,这是不可能的,因为User 对象几乎是由django.contrib.auth 设置的。
有什么方法可以防止删除级联,同时仍然可以直接从user 访问人员?创建扩展django.contrib 版本的User 模型是唯一 方法吗?
更新
我更改了型号名称,希望现在它更清晰一点。基本上,有数以千计的 Person 记录。不是每个人都有登录名,但如果有,他们只有一个登录名。
【问题讨论】:
标签: django django-authentication one-to-one cascading-deletes