是否有可能在 Django 中有一个仅在一个方向上为 null=True 的 OneToOneField?

Is it possible to have a OneToOneField in Django that's only null=True in one direction?

是否可以在 Django 中创建一个只有 null=True 个方向的 OneToOneField

例如:

class Building(models.Model):
    ...

class Roof(models.Model):
    building = models.OneToOneField(...)
    ...

建筑在技术上不需要有屋顶。许多未完工的建筑没有它们。但是没有建筑物就没有屋顶。

此外,一栋建筑只能有一个屋顶,屋顶只能在一栋建筑上,因此OneToOneField

您的模型设置已经完成了。

b1 = models.Building.objects.create()  # no error
b2 = models.Building.objects.create()  # no error
r1 = models.Roof.objects.create()      # violates null constraint

psycopg2.errors.NotNullViolation: null value in column "building_id" of 
relation "users_roof" violates not-null constraint

r2 = models.Roof.objects.create(building=b2) # no error

你剩下 Building b1,没有 RoofBuilding b2,有 Roof r2

请记住,OneToOneField 不是“对称的”,因为您将字段放入两个模型中的哪一个很重要。根据定义的模型,您基本上会得到一个底层 Building 数据库 table,未提及 RoofRoof table 包含一个带有 foreign key 的列(带有 unique约束)回到Building。这就是为什么创建 Building 不需要指定 Roof,但创建 Roof 需要指定关联的 Building.