【问题标题】:How to force Django to delete objects using multiple inheritance如何强制 Django 使用多重继承删除对象
【发布时间】:2016-08-08 16:05:40
【问题描述】:

我有一个对象模型如下:

class Corporation(models.Model):
    corp_id = models.AutoField(primary_key=True)
    original_name = models.CharField(max_length=1000, blank=True, null=True)
    address = models.ManyToManyField(Address, related_name='corp_address')

class Person(models.Model):
    person_id = models.AutoField(primary_key=True)
    person_address = models.ManyToManyField(Address, related_name='person_address')

class Address(models.Model):
    address1 = models.CharField(max_length=500, blank=True, null=True)
    address2 = models.CharField(max_length=500, blank=True, null=True)
    city = models.CharField(max_length=100, blank=True, null=True)
    state = models.CharField(max_length=100, blank=True, null=True)
    zipcode = models.CharField(max_length=20, blank=True, null=True)
    country = models.CharField(max_length=100, blank=True, null=True)

class Committee(Corporation):
    name = models.CharField(blank=True, max_length=200, null=True)
    industry = models.CharField(blank=True, max_length=100, null=True)

当我创建一个委员会对象时,我创建了一个公司和一个地址对象。一个 Address 对象可能有多个 Corporation 指向它。

但是,当我执行 Committee.objects.delete() 时,Django 会删除委员会对象,但不会删除相关的 Corporation 或 Address 对象。

当我删除一个委员会对象时,如果另一个对象没有指向它,我想删除关联的地址对象。如果另一个对象不指向它,我也想删除关联的 Corporation 对象。

我该如何进行这种有条件的级联删除?

【问题讨论】:

    标签: python django multiple-inheritance


    【解决方案1】:

    查看 on_delete 在 django 中设置为级联,这也将删除相关记录。

    在您的模型中,请以这种方式添加 on_delete = models.CASCADE:

     class Car(models.Model):
         manufacturer = models.ForeignKey(
             'Manufacturer', on_delete=models.CASCADE)
    

    这是一个很好的post,它解释了 Django 上的 models.CASCADE delete 和 ManyToMany 关系。

    【讨论】:

    • 谢谢。我注意到您在示例中使用了 ForeignKey() 与 ManytoMany() 。如果多个对象指向地址对象,您的示例会删除它吗?
    • 我认为您必须了解多对多关系和级联删除的工作原理。我已经用一个帖子更新了答案,让您更好地理解。
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 2011-11-17
    • 2021-10-29
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多