Python Django OneToOneField允许在线一次引用

Python Django OneToOneField允许在线一次引用,python,django,model,Python,Django,Model,我正在尝试创建一个一对一引用,并希望确保该引用不允许用于其他模型或实例 比如说 假设我有地址模型、人物模型和公司模型 Person有一个要寻址的OneToOneField字段 该公司还有一个OneToOneField字段要处理 address=Address(data="some address") company=Company(name="some company",address=address) person=Person(name="my name",address=address)

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

比如说

假设我有地址模型、人物模型和公司模型

Person有一个要寻址的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)
我希望系统对此抛出一个错误,因为我正在为两个不同的型号设置相同的地址

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

通常情况下,你用代码来理解这一点,而不是犯这样愚蠢的错误。
但是,由于它是一对一的,所以系统可以捕获它吗?

在删除的情况下,您可以在_delete=models.PROTECT上使用
。在另一种情况下,您可以添加
unique=True
,这样个人id=1将有一个地址id=1,个人id=2不能再有地址id=1。但它只能解决一个模型:
address=models.ForeignKey(address,unique=True,on\u delete=models.PROTECT)

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

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)  
请注意,我使用了
blank=True,null=True
,因此您可以仅使用个人或公司创建实例,而无需使用两者创建实例。也有一个元使用主键的组合

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)

   class Meta:
       unique_togther = ('id_address', 'id_person', 'id_company')
       # Not sure if it will throw a error here because `id_person` and `id_company` can be blank 
       # or null. But the use of `unique together` is for cases where you want to guarantee 
       # the combination of the primary keys will be unique.

希望有帮助。

在删除的情况下,您可以在_delete=models.PROTECT上使用
。在另一种情况下,您可以添加
unique=True
,这样个人id=1将有一个地址id=1,个人id=2不能再有地址id=1。但它只能解决一个模型:
address=models.ForeignKey(address,unique=True,on\u delete=models.PROTECT)

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

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)  
请注意,我使用了
blank=True,null=True
,因此您可以仅使用个人或公司创建实例,而无需使用两者创建实例。也有一个元使用主键的组合

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)

   class Meta:
       unique_togther = ('id_address', 'id_person', 'id_company')
       # Not sure if it will throw a error here because `id_person` and `id_company` can be blank 
       # or null. But the use of `unique together` is for cases where you want to guarantee 
       # the combination of the primary keys will be unique.
希望能有帮助