我有2个模型(为了简单起见,我省略了__str__
表示)。
Customer
:
# 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)
和Device_group
:
# 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)
每个Customer
只能有1个Device_group
默认值。我希望能够阻止在Customer
仍然存在时删除默认组。但是,删除Customer
时,应删除所有设备组,包括默认组。
为了防止删除默认组,我使用pre_delete信号,如下所示:
# 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)
当用户尝试从Django Admin中的ProtectedError
模型中删除默认组时,这会引发Device_group
并阻止删除。
为了确保在删除Customer
时删除所有设备组(包括默认组),我尝试使用另一个pre_delete信号将is_default
字段更改为False并删除该组,如下所示:
# 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()
当试图删除一个有默认Customer
的Device_group
时,它会产生ProtectedError
。
如何确保在删除Customer
后,所有设备组都会被删除而不会抛出ProtectedError
。但是当它是默认组时,会阻止删除Device_group
吗?
我使用的是Python 3.7.2和Django 2.1.7
谢谢
更改你的on_delete
动作:
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_group.is_default=False
之后你需要通过default_group.save()
保存它
• 关闭级联删除
• 使用 python SDK v2 删除 AzureML 模型
• 在 ASP.NET Core 3 Web API 中进行模型验证之前从 json 数组属性中删除空项
• 如何在 django 中分离用户登录会话和管理员登录会话
• 如何在 react-native-paper-dates 中删除人物或添加自定义图标
• 在 DialogFragment 附近轻按外部以关闭不工作
• 在Wagtail中,如何防止页面被编辑删除,或者设置最小页面数之类的
• 当数据库中没有数据时,隐藏 - 不支持的操作数类型:“int”和“NoneType”
• 我们是否可以在localStorage[closed]上只删除一个元素?