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)
。但您不应该这样做。