Come eliminare un record nei modelli Django?


267

Voglio cancellare un particolare record. Ad esempio

delete from table_name where id = 1;

Come posso farlo in un django model?


16
Grazie per aver posto la domanda. A volte RTFM impiega molto più tempo di una ricerca su Google e SO, come evidenziato dal numero di voti di risposta e dal numero di visualizzazioni
Freedom_Ben

8
Concordato con @Freedom_Ben, ma per i futuri lettori che amano comunque il manuale f *, questo è quello che stai cercando: docs.djangoproject.com/en/dev/topics/db/queries/…
Dinei

Risposte:


513

Ci sono un paio di modi:

Per eliminarlo direttamente:

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

Per eliminarlo da un'istanza:

instance = SomeModel.objects.get(id=id)
instance.delete()

50
Nota che il primo non chiamerà il metodo .delete () dell'oggetto, quindi se hai quel codice 'cleanup' in quel metodo non verrà chiamato. Generalmente non è un problema, ma vale la pena ricordare.
Matthew Schinckel,

8
@Matthew Schinckel: è vero. Se si desidera disporre di un metodo di eliminazione personalizzato, è necessario utilizzare invece il segnale pre_deleteo post_delete.
Wolph,

2
Non so che cosa succede dopo DJango 1.4, ma questo in realtà sta recuperando tutti i PK e quindi eliminandoli da quei PK. Quindi, ad esempio, se si elimina da un campo arbitrario, questo può essere molto più lento della controparte SQL ... :(
Vajk Hermecz

1
@VajkHermecz: questo è vero e il comportamento previsto a causa dei segnali di eliminazione. Il sistema di segnali Django deve tenere traccia di tutte le modifiche al database perché qualcosa potrebbe agganciarlo (come fa l'inversione).
Wolph,

3
È possibile utilizzare il valore restituito di delete()per verificare ciò che si stava eliminando. Restituisce una tupla con il conteggio degli oggetti eliminati e un dizionario con dettagli sui tipi eliminati, ad es (1, {'yourapp.SomeModel': 1}).
Mc

37
MyModel.objects.get(pk=1).delete()

questo genererà un'eccezione se l'oggetto con la chiave primaria specificata non esiste perché inizialmente tenta di recuperare l'oggetto specificato.

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

ciò non genererà eccezioni se l'oggetto con la chiave primaria specificata non esiste e produce direttamente la query

DELETE FROM my_models where id=1

1
Errore di battitura MyModel.object.filter(pk=1).delete(). Dovrebbero essere "oggetti".
Nigel,

8

se si desidera eliminare un'istanza, scrivere il codice

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

se si desidera eliminare tutte le istanze, scrivere il codice

delet= Account.objects.all()
delete.delete()

7

Se si desidera eliminare un elemento

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

Ad esempio, se si desidera eliminare tutti gli elementi nella lista dei desideri

Wishlist.objects.all().delete()

6

Wolph ha fornito una buona risposta focalizzata sui codici. Vorrei solo incollare qui il documento ufficiale , per riferimento delle persone.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.