django 如何删除模型示例和OneToOne关系中的示例

7vhp5slm  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(130)

我在django rest中有两个模型:

class CustomUser(AbstractBaseUser):
    email = models.EmailField(max_length=255, unique=True)

class Teacher(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

删除教师示例时,如何删除相关的CustomUser示例?
我尝试了这段代码,但它给出了这个错误“调用Python对象时超过了最大递归深度”

@receiver(pre_delete, sender=Teacher)
def delete_user(sender, instance, **kwargs):
    instance.user.delete()
aoyhnmkz

aoyhnmkz1#

问题是你使用的是pre_delete信号,因此它会先删除CustomUser。CustomUser的删除会级联并删除你的Teacher,但在删除Teacher之前,信号会被再次调用,从而导致无限循环。
将@receiver上的pre_delete更改为post_delete。

5gfr0r5j

5gfr0r5j2#

在www.example.com中settings.py,将此代码行写在INSTALLED_APPS之后。

AUTH_USER_MODEL = 'your_app_name.CustomUser'

Models.py:

class Teacher(models.Model):
     user = models.OneToOneField(CustomUser, on_delete=models.CASCADE,blank=True, null=True)

View.py 或如果您有单独的Signals.py:

@receiver(pre_delete, sender=CustomUser)
def delete_user(sender, instance, **kwargs):
    user = Teacher.objects.get(user=instance)
        user.delete()

试试这个代码。

相关问题