首页 > 解决方案 > Django:将外键限制为仅具有相同ID的行

问题描述

对于一个 Django 项目,我有两个模型:

class User(AbstractUser):
    child = models.ForeignKey('children.Child', null=True, on_delete=models.SET_NULL)

以及以下内容:

class Child(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

我想要的是User.child只能设置为具有child.user_id = user.id, 最好有约束的实体。这可能吗?如果重要的话,我正在使用 PostgreSQL

标签: pythonsqldjangopostgresqldjango-models

解决方案


你不是在寻找一对一的关系吗?

  • userinChild只能设置为一个User
  • childinUser也只能设置为一个Child
  • 你想要userinChildchildinUser指向对方。

这正是一对一的关系。以下代码比您当前的代码更简单,它在数据库级别强制执行约束:

class User(AbstractUser):
    # The relationship only needs to be defined in one of the models
    pass

class Child(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)

如果您需要涵盖更精细的点(例如,如果在某些情况下您需要在一个方向而不是在另一个方向定义关系),那么请澄清用例。


推荐阅读