我正在尝试创建一对一引用,并希望确保不允许将该引用用于其他模型或实例。
例如
说我有一个地址模型,人模型和公司模型
人员有一个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个不同的模型。
如果我删除地址,这也会同时删除个人和公司。
通常,您可以使用代码来捕获此错误,而不会犯这样的愚蠢错误。 但是由于它是一对一的,系统可以捕获它吗?
答案 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
希望有帮助。