Python Django OneToOneField允许在线一次引用
我正在尝试创建一个一对一引用,并希望确保该引用不允许用于其他模型或实例 比如说 假设我有地址模型、人物模型和公司模型 Person有一个要寻址的OneToOneField字段 该公司还有一个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)
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.
希望能有帮助