0

我的代码中有这些模型

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.CASCADEDjango 的工作原理。如果我删除一条Address记录,相应的User记录就会被删除,但这不是我想要的。Address如果记录被删除,我希望User记录被删除。

我知道我可以通过放入OneToOneFieldAddress不是来实现这一点User,但是从数据库模式的角度来看,这对我来说没有意义,因为 aUser有一个Address. 一个Address没有User

我尝试搜索如何强制删除以相反的方式进行,但显然 Django 拥有的所有选项都不可能(https://docs.djangoproject.com/en/3.1/ref/models/fields/# django.db.models.ForeignKey.on_delete)。

有人知道替代方案吗?或者以其他方式构建数据库模式的正确方法?

谢谢!

4

1 回答 1

0

我不知道如何在您的混淆层(orm)中指定,但在数据库级别您指定类似

,constraint usr2adr_fk
            foreign key (adr_id)
            references address(id)
            on delete set null         --<<< instead of delete

仅供参考:

  • 1:1 的关系总是有问题的。有时出于安全原因,或者如果您对某些列进行重要分析。但否则只需将列从子表移动到父表中。此外,在数据库级别,它们很难实际执行。您需要对列进行双向 FK 和唯一约束。
  • 年龄是一个很差的属性。它每年都会更改,因此您需要更新以使其保持最新状态,但并非所有这些都同时更改。存储出生日期然后在需要时计算年龄要好得多。无需更新。
于 2020-09-11T18:49:48.497 回答