Django OneToOneField on_delete CASCADE约定

问题描述

我的代码中有这些模型

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 }}有一个UserAddress没有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和列上的唯一约束。
  • 年龄是非常糟糕的属性。它每年更改一次,因此您需要进行更新以使其保持最新状态,但并非所有更新都同时更改。更好地存储出生日期,然后在需要时计算年龄。无需更新。