代码之家  ›  专栏  ›  技术社区  ›  Evren Bingøl

Django OneToOneField允许在线一个参考

  •  1
  • Evren Bingøl  · 技术社区  · 6 年前

    例如

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

    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)
    

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

    通常你用代码来理解这一点,而不是犯这样愚蠢的错误。

    0 回复  |  直到 6 年前
        1
  •  0
  •   RonanFelipe    6 年前

    在删除的情况下,您可以使用 on_delete=models.PROTECT . 在另一种情况下你可以加上 unique=True
    address=models.ForeignKey(Address, unique=True, on_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.
    

    希望有帮助。