2017-10-09 3 views
1
class A(models.Model): 
    name = models.CharField(max_length=128) 

class B(modes.Model): 
    type_b = models.ForeignKey(A) 

Comment supprimer l'objet parent du modèle 'A' lorsque je supprime un objet enfant lié du modèle 'B'. Je supprime l'objet enfant via l'option de suppression en bloc de l'administrateur DjangoSupprimer l'objet parent lorsque l'objet enfant est supprimé dans Django

+0

Mais je pense que vous devez ajouter ce « on_delete = models.CASCADE » au champ ForeignKey et vous pouvez supprimer un (modèles) qui supprime automatiquement B (modèles). –

Répondre

1

Vous devez utiliser signals.

@receiver(post_delete, sender=B) 
def delete_a(sender, instance, **kwargs): 
    # instance.type_b is the object which you want to delete 
+0

Lorsque j'essaie de supprimer en utilisant 'instance.type_b.delete()' Je reçois l'objet 'NoneType 'n'a pas d'attribut' delete'' erreur –

+0

@albinantony Faire de cette façon A.objects.filter (pk = instance.type_b .pk) .delete() –

+0

Que se passe-t-il si l'utilisateur a des autorisations uniquement sur le modèle enfant et non sur le modèle parent? Est-ce que le signal 'post_delete' fonctionnerait pour supprimer les deux? @DavitTovmasyan – filtfilt

0

Une meilleure façon de le faire, il suffit d'ajouter [on_delete=models.CASCADE][1]

:

class A(models.Model): 
    name = models.CharField(max_length=128) 

class B(modes.Model): 
    type_b = models.ForeignKey(A,on_delete=models.CASCADE) 
+0

J'ai essayé 'models.CASCADE' mais il ne fonctionne pas comme prévu. –

+0

Comme l'a dit Davit Tovmasyan, essayez d'utiliser SIGNAL post_delete – Lemayzeur

0

Vous pouvez utiliser le signal post_delete pour supprimer le parent comme suggéré par Davit Tovmasyan. Mais en raison de la nature en cascade que l'objet parent A est supprimé, il supprimera également tous les objets B connectés qui vont émettre post_delete signal sur le modèle B. Ainsi, lors de la deuxième émission de post_delete, le gestionnaire de signal tente de supprimer un élément déjà supprimé, ce qui provoque 'NoneType' object has no attribute 'delete'. Vous pouvez utiliser le gestionnaire d'exception ou simplement utiliser la condition if pour gérer cela.

def delete_parent(sender, instance, **kwargs): 
    if instance.type_b: 
     instance.type_b.delete() 

post_delete.connect(delete_parent, sender=B)