gpt4 book ai didi

django - OneToOneField 和删除

转载 作者:行者123 更新时间:2023-11-28 19:35:27 26 4
gpt4 key购买 nike

我有以下模型:

from django.db import models
from django.contrib.auth.models import User


class Profile(models.Model):
user = models.OneToOneField(User)
# ...

def __unicode__(self):
return u'%s %s' % (self.user.first_name, self.user.last_name)

当使用 Django 管理员删除用户时,配置文件也会被删除,这正是我想要的。但是,当使用 Django 管理员删除配置文件时,用户不会被删除,这不是我想要的。我怎样才能做到删除配置文件也会删除用户?

最佳答案

由于 Profile 链接到 User,因此它是关系中的依赖模型。因此,当您删除用户时,它会删除所有依赖模型。但是,当您删除配置文件时,由于 User 不依赖于配置文件,因此它不会被删除。

不幸的是,根据on_delete Django docs , 没有删除父关系的 on_delete 规则。为此,您可以覆盖 Profiledelete 方法:

class Profile(models.Model):
# ...

def delete(self, *args, **kwargs):
self.user.delete()
return super(self.__class__, self).delete(*args, **kwargs)

然后在做的时候:

Profile.objects.get(...).delete()

还将删除配置文件的用户。然而,当使用查询集删除配置文件时,不会调用 delete 方法(这是在 Django Admin 中调用的),因为 Django 使用 SQL DELETE 批量删除对象:

Profile.objects.filter(...).delete()

在这种情况下,按照 Django 的建议 docs ,您将不得不使用 post_delete 信号 ( docs )。

from django.dispatch import receiver
from django.db.models.signals import post_delete

@receiver(post_delete, sender=Profile)
def post_delete_user(sender, instance, *args, **kwargs):
if instance.user: # just in case user is not specified
instance.user.delete()

关于django - OneToOneField 和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com