Python Django:除非删除父模型,否则禁止删除子模型

Python Django:除非删除父模型,否则禁止删除子模型,python,django,Python,Django,我有两个模型(为了简单起见,我省略了\uuu str\uu表示) 客户: # models.py class Customer(models.Model): customer_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True) customer_name = models

我有两个模型(为了简单起见,我省略了
\uuu str\uu
表示)

客户

# models.py

class Customer(models.Model):
    customer_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, 
                                     editable=False, db_index=True)
    customer_name = models.CharField(max_length=128)
设备组

# models.py

class Device_group(models.Model):
    group_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, 
                                  editable=False, db_index=True)
    customer_uuid = models.ForeignKey(Customer, on_delete=models.CASCADE)
    device_group_name = models.CharField(max_length=20)
    color = models.CharField(max_length=8)
    is_default = models.BooleanField(default=False)
每个
客户
只能有一个默认的
设备组
。我希望能够防止在
客户
仍然存在时删除默认组。但是,当删除
客户
时,应删除所有设备组,包括默认组

为了防止删除默认组,我使用如下预删除信号:

# signals.py

@receiver(pre_delete, sender=Device_group)
def protect_default_group(sender, instance, **kwargs):
    if instance.is_default:
        raise ProtectedError('The default group cannot be deleted.', instance)                        
# signals.py

@receiver(pre_delete, sender=Customer)
def unprotect_default_group(sender, instance, **kwargs):
    default_group = Device_group.objects.get(customer_uuid=instance, is_default=True)                                         
    default_group.is_default=False
    default_group.delete()
这会引发一个
ProtectedError
,并在用户试图从Django Admin中的
Device_group
模型中删除默认组时防止删除

为了确保在删除
客户
时删除所有设备组,包括默认组,我尝试使用另一个pre_delete信号将
is_default
字段更改为False,并按如下方式删除组:

# signals.py

@receiver(pre_delete, sender=Device_group)
def protect_default_group(sender, instance, **kwargs):
    if instance.is_default:
        raise ProtectedError('The default group cannot be deleted.', instance)                        
# signals.py

@receiver(pre_delete, sender=Customer)
def unprotect_default_group(sender, instance, **kwargs):
    default_group = Device_group.objects.get(customer_uuid=instance, is_default=True)                                         
    default_group.is_default=False
    default_group.delete()
尝试删除具有默认
设备组的
客户时,会导致
保护错误

如何确保在删除
客户
时,始终删除所有
设备组,而不抛出
ProtectedError
。但是当设备组是默认组时,是否禁止删除该设备组

我使用的是Python 3.7.2和Django 2.1.7


谢谢在
default\u组之后。是否默认=False
您需要通过
default\u组保存它。save()
在删除时更改
操作:

customer_uuid = models.ForeignKey(Customer, on_delete=models.DO_NOTHING)
然后调整你的信号

@receiver(pre_delete, sender=Customer)
def unprotect_default_group(sender, instance, **kwargs):
    Device_group.objects.filter(customer_uuid=instance,
    is_default=False).delete()

谢谢你的回复。我试着按照您的建议保存,并在调用
default\u group.delete()
之前保存。两者都会导致
ProtectedError
。最初,设备组是
is\u default=True
,因此只需
device\u group.objects.filter(customer\u uuid=instance)。delete()
将取消,但如果要确保所有组都设置为非默认组,则可以执行
device\u group.objects.filter(customer\u uuid=instance)。更新(is_default=False)
。但您不应该这样做。