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