Comment supprimer un enregistrement dans les modèles Django?

267

Je souhaite supprimer un enregistrement particulier. Tel que

delete from table_name where id = 1;

Comment puis-je faire cela dans un django model?

user426795
la source
16
Merci d'avoir posé la question. Parfois, RTFM prend beaucoup plus de temps qu'une recherche Google et SO, comme en témoigne le nombre de votes de réponse et le nombre de vues
Freedom_Ben
8
D'accord avec @Freedom_Ben, mais pour les futurs lecteurs qui aiment le manuel f * de toute façon, voici
Dinei

Réponses:

513

Il y a deux façons:

Pour le supprimer directement:

SomeModel.objects.filter(id=id).delete()

Pour le supprimer d'une instance:

instance = SomeModel.objects.get(id=id)
instance.delete()
Wolph
la source
50
Notez que le premier n'appellera pas la méthode .delete () de l'objet, donc si vous avez du code de «nettoyage» dans cette méthode, il ne sera pas appelé. En général, ce n'est pas un problème, mais cela vaut la peine d'être gardé à l'esprit.
Matthew Schinckel
8
@Matthew Schinckel: c'est vrai. Si vous souhaitez avoir une méthode de suppression personnalisée, vous devez plutôt utiliser le signal pre_deleteou post_delete.
Wolph
2
Je ne sais pas ce qui est le cas après DJango 1.4, mais il s'agit en fait de récupérer tous les PK, puis de les supprimer par ces PK. Donc, par exemple, si vous supprimez par un champ arbitraire, cela peut être beaucoup plus lent que l'équivalent SQL ... :(
Vajk Hermecz
1
@VajkHermecz: c'est vrai et le comportement attendu à cause des signaux de suppression. Le système de signaux Django doit suivre toutes les modifications de la base de données car quelque chose pourrait s'y accrocher (comme le fait la réversion).
Wolph
3
Vous pouvez utiliser la valeur de retour de delete()pour vérifier ce que vous supprimiez. Il renvoie un tuple avec le nombre d'objets supprimés et un dictionnaire avec des détails sur les types supprimés, par exemple (1, {'yourapp.SomeModel': 1}).
mcb
37
MyModel.objects.get(pk=1).delete()

cela lèvera une exception si l'objet avec la clé primaire spécifiée n'existe pas car au début, il essaie de récupérer l'objet spécifié.

MyModel.objects.filter(pk=1).delete()

cela ne déclenchera pas d'exception si l'objet avec la clé primaire spécifiée n'existe pas et qu'il produit directement la requête

DELETE FROM my_models where id=1
Milad Khodabandehloo
la source
1
Tapez MyModel.object.filter(pk=1).delete(). Ce devrait être des "objets".
Nigel
8

si vous voulez supprimer une instance, écrivez le code

delet= Account.objects.get(id= 5)
delet.delete()

si vous voulez supprimer toutes les instances, écrivez le code

delet= Account.objects.all()
delete.delete()
beau islam
la source
7

Si vous souhaitez supprimer un élément

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

Si vous souhaitez supprimer tous les éléments de la liste de souhaits par exemple

Wishlist.objects.all().delete()
Ahmed Adewale
la source
6

Wolph a fourni une bonne réponse des codes focalisés. Permettez-moi de coller le document officiel ici, pour référence.

VicX
la source