保护删除ForeignKey

时间:2018-07-23 13:09:42

标签: python django postgresql django-models django-database

是否可以确保无法删除ForeignKey

最好的例子是在UserProfile上:

class UserProfile(Model):
    user = models.OneToOneField('User',on_delete=models.CASCADE ...)

在创建UserProfile对象之后,立即有信号为给定的User创建User

我想确保没有人可以删除UserProfile,因为每个User都必须有一个UserProfile

我尝试了on_delete=models.PROTECT,但不允许删除User而不是UserProfile

2 个答案:

答案 0 :(得分:0)

您可以尝试向模型中添加两​​个参数null=Trueon_delete=models.SET_NULL,这样看起来就像:

user = models.OneToOneField('User', on_delete=models.SET_NULL, null=True)

答案 1 :(得分:-1)

我不知道我在哪里读书,也没有示例代码, 但是您需要使用pre_delete信号来防止删除

pre_delete:每当在UserProfile模型上启动删除操作时,都会调用信号,因此您可以在此处执行任何操作。

django.db.models.signals.pre_delete在UserProfile模型上

from django.db.models.signals import pre_delete

class UserProfile(Model):
    user = models.OneToOneField('User',on_delete=models.CASCADE ...)

def your_receiver_function(sender, instance, *args, **kwargs):
                  if not instance.user:  //if the user is not already deleted don't delete userprofile
                        return False   

pre_delete.connect(your_receiver_function, sender=UserProfile)