OneToOne Model 删除 Cascade 的两种方式

use*_*631 4 django django-models

我有 2 个型号:

   class A(models.Model):
        name = models.CharField(max_length=50)


        def __str__(self):
            return "%s the place" % self.name

    class B(models.Model):
        a = models.OneToOneField(Place,on_delete=models.CASCADE)
        name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我想:

  1. 如果A被删除,B也会被删除(有效)
  2. 如果 B 被删除,A 也会被删除

Tia*_*mes 5

我认为你可以使用两个主要选项:

1 - 在模型 B 上创建信号 post_delete,这将删除模型 A 上的记录: https ://docs.djangoproject.com/en/3.2/ref/signals/#django.db.models.signals.post_delete

2 - 覆盖模型 B 上的删除方法: 覆盖 django 的模型删除方法以进行批量删除

正如 @iserranoe 在评论中指出的那样,在删除多个模型时,解决方案 2 将无法正常工作。因此,为了避免覆盖 Django 默认方法,我强烈建议使用 post_delete 信号