J'ai ces modèles.Empêcher Django en cascade supprimer à la superclasse
# models.py
class A(models.Model):
name = models.CharField('Name', max_length=50)
class B(A):
a_ptr = models.OneToOneField('A', primary_key=True, editable=True, parent_link=True)
number = models.CharField('Number', max_length=15)
La relation que je suis en train de capturer est que chaque B est aussi un A, mais un A est pas nécessairement un B. Je pourrais utiliser un ForeignKey à la place, mais je préfère faire référence aux champs hérités de B, tel que B.name. La façon dont j'ai l'intention d'utiliser ces modèles est que A sera toujours instancié en premier. Et chaque fois qu'un B est instancié, il devra choisir un B existant (mais pas déjà pris).
Cela fonctionne assez bien jusqu'à présent, mais le seul problème que j'ai est avec les suppressions en cascade. Avec cette configuration, la suppression d'un B supprimera son A correspondant (ou du moins c'est ce qui se passe dans l'admin de django). Comment pourrais-je désactiver cette cascade?
Je suis conscient de l'attribut on_delete, mais si je l'ai défini, disons DO_NOTHING sur le champ a_ptr, cela aura pour effet de permettre à B d'exister sans A correspondant plutôt que l'inverse.
Comment est-ce que je peux faire ceci?
[Cette réponse] (http://stackoverflow.com/questions/3711191/django-deleting-object-keeping-parent) est assez astucieuse (basculez 'b.a_ptr' pour pointer vers une instance différente avant de la supprimer). Je ne sais pas s'il y a une manière moins hacky. – Alasdair