У меня есть 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)
Это вызывает ProtectedError и предотвращает удаление, когда пользователь пытается удалить группу по умолчанию из модели Device_group в Django Admin.
Чтобы убедиться, что все группы устройств, включая группу по умолчанию, удаляются при удалении 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.
Спасибо






После default_group.is_default=False нужно сохранить его на default_group.save()
Измените действие 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()
Изначально группа устройств is_default=True
Так что просто Device_group.objects.filter(customer_uuid=instance).delete() подойдет
Но если вы хотите убедиться, что все группы установлены не по умолчанию, вы можете сделать Device_group.objects.filter(customer_uuid=instance).update(is_default=False). Но тебе не следовало этого делать.
Спасибо за ответ. Я попытался просто сохранить, как вы предложили, и сохранить перед вызовом
default_group.delete(). Оба по-прежнему приводят кProtectedError.