Если я правильно понимаю, здесь не важно, что B наследуется от A. У вас просто для каждого объекта класса A есть соответствующий объект класса B, так? Тогда вам поможет signals.pre_delete
Насколько я помню, на низком уровне наследование модели реализуется именно через внешний ключ дочерней модели, ссылающийся на родительскую, то есть фактически наследование — синтаксический сахар такого случая:
class A(models.Model):
'some stuff'
class B(models.Model):
ptr = models.OneToOneField(A)
Поэтому, думаю, хабраюзер всё правильно написал. Опишите сигнал pre_delete для модели A, в котором сделайте что-то типа такого:
def pre_delete(sender, **kwargs):
instance = kwargs['instance']
# По идее, B является подклассом A, поэтому этот сигнал сработает и при удалении модели B.
# Нам этого не нужно
if type(instance) is B:
return
# Предварительное удаление детей
B.objects.filter(ptr_id=instance.pk).delete()
Нужно только посмотреть, как именно называется поле со ссылкой на родительский объект. Уточнить можно в базе, например. Или через интроспекцию модели в shell.