Django OneToOneField允许在线参考

时间:2019-07-08 23:23:33

标签: python django model

我正在尝试创建一对一引用,并希望确保不允许将该引用用于其他模型或实例。

例如

说我有一个地址模型,人模型和公司模型

人员有一个OneToOneField字段要处理 公司也有一个要发送的OneToOneField字段

address=Address(data="some address")
company=Company(name="some company",address=address)
person=Person(name="my name",address=address)

型号:

class Address(models.Model):
  data = models.CharField(max_length=255, blank=True, null=True)
class Company(models.Model):
  name = models.CharField(max_length=255, blank=True, null=True)
  address=models.OneToOneField(Address,on_delete=models.CASCADE)
class Person(models.Model):
  name = models.CharField(max_length=255, blank=True, null=True)
  address=models.OneToOneField(Address,on_delete=models.CASCADE)

我希望系统对此抛出错误,因为我将相同的地址设置为2个不同的模型。

如果我删除地址,这也会同时删除个人和公司。

通常,您可以使用代码来捕获此错误,而不会犯这样的愚蠢错误。 但是由于它是一对一的,系统可以捕获它吗?

1 个答案:

答案 0 :(得分:0)

在删除的情况下,您可以使用 firefox 5.1:0 chrome 5.0: firefox 5.1:1 chrome 5.0: firefox 5.1:2 chrome 5.0: 。在另一种情况下,您可以添加on_delete=models.PROTECT,因此一个人id = 1将具有一个地址id = 1,一个人id = 2将不再具有一个地址id = 1。但这只会解决一个模型:
unique=True

一种新方法是创建一个模型,以同时引用公司和个人的地址,并能够禁止使用相同的地址ID进行创建:

address=models.ForeignKey(Address, unique=True, on_delete=models.PROTECT)

请注意,我使用了class AddressExample(models.Model): id_address = models.ForeignKey(Address, unique=True,on_delete=models.PROTECT) id_person = models.ForeignKey(Person, blank=True, null=True, unique=True, on_delete=models.PROTECT) id_company = models.ForeignKey(Person, blank=True, null=True, unique=True, on_delete=models.PROTECT) ,因此您可以仅使用Person或Company创建实例,而无需同时使用实例或Company创建实例。也有一个Meta也可以使用主键的组合。

blank=True, null=True

希望有帮助。