问题描述
我的代码中有这些模型
class Address(models.Model):
street = models.CharField(max_length=50)
city = models.CharField(max_length=10)
class User(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
address = models.OnetoOneField(Address,on_delete=models.CASCADE)
我了解models.CASCADE
在Django中的工作方式。如果删除Address
记录,则会删除相应的User
记录,但这不是我想要的。如果要删除Address
记录,我希望删除User
记录。
我知道我可以通过将OnetoOneField
放入Address
而不是User
来实现这一点,但是从数据库模式的角度来看,这对我没有意义,因为{{1 }}有一个User
。 Address
没有Address
。
我尝试搜索如何强制以相反的方式进行删除,但是显然不可能从Django(https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.ForeignKey.on_delete)的所有选项中进行。
谢谢!
解决方法
我不知道如何在混淆层(orm)中指定,但是在数据库级别,您指定类似
,constraint usr2adr_fk
foreign key (adr_id)
references address(id)
on delete set null --<<< instead of delete
仅供参考,
- 1:1的关系总是值得怀疑的。有时出于安全原因,或者如果您进行了大量分析,则其中一些专栏文章有时会出现。但是否则,只需将列从子表移至父表即可。而且,在数据库级别,它们实际上很难实施。您需要双向FK和列上的唯一约束。
- 年龄是非常糟糕的属性。它每年更改一次,因此您需要进行更新以使其保持最新状态,但并非所有更新都同时更改。更好地存储出生日期,然后在需要时计算年龄。无需更新。