Elimina più oggetti in django


108

Devo selezionare diversi oggetti da eliminare dal mio database in Django utilizzando una pagina web. Non esiste una categoria da cui selezionare, quindi non posso eliminarle tutte in questo modo. Devo implementare il mio modulo di cancellazione ed elaborarlo in django o django ha già un modo per farlo? Poiché è implementato nell'interfaccia di amministrazione.

Risposte:


203

Puoi eliminare qualsiasi QuerySet che desideri. Ad esempio, per eliminare tutti i post del blog con un modello di post

Post.objects.all().delete()

e per eliminare qualsiasi post con una data di pubblicazione futura

Post.objects.filter(pub_date__gt=datetime.now()).delete()

Tuttavia, è necessario trovare un modo per restringere il QuerySet. Se desideri che una vista elimini un particolare oggetto, guarda nella vista generica di eliminazione .

MODIFICARE:

Scusa per il fraintendimento. Penso che la risposta sia da qualche parte nel mezzo. Per implementare il proprio, si combinano ModelForms e viste generiche . Altrimenti, esamina le app di terze parti che forniscono funzionalità simili. In una domanda correlata , la raccomandazione era django-filter .


1
No, hai frainteso la domanda. Capisco di poter cancellare tutto. Ma ho bisogno di selezionare gli oggetti da eliminare con un modulo su una pagina web. Quindi elabora i dati restituiti dal modulo in my views.py. Quindi eseguire il ciclo di ciò che è restituito nel modulo eliminandolo mentre scorre i dati. Ma volevo sapere qual è la migliore pratica per implementarlo in django.
Decano

Ah, errore mio! Vorrei utilizzare un'app di terze parti o visualizzazioni generiche con ModelForms.
Matt Luongo

7
@ Dean, dai un'occhiata a quella vista di eliminazione. Oppure puoi semplicemente scrivere la tua vista ... Voglio dire che alla fine probabilmente stai ricevendo un elenco di PK e stai chiamando l'eliminazione sul tuo modello ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()e sono sicuro che vuoi qualcosa per assicurarti che una persona a caso non possa eliminare tutto oggetti nel tuo DB indovinando PK.
Yuji 'Tomita' Tomita

1
@ Dean, è difficile rispondere alla tua domanda senza capirne di più. Hai solo bisogno di costruire un modulo che consenta a un utente di selezionare i criteri di eliminazione corretti (qualunque esso sia - forse anche una casella di input in cui si digita un numero ID ... ma probabilmente più complesso), costruire una vista che risponda a quello form, forse esegue la convalida (autorizzazioni), e quindi finalmente esegue quel filter(foo).delete()metodo.
Yuji 'Tomita' Tomita

1
Uno dei motivi per cui questo non viene fornito con il framework è la questione dell'autorizzazione per modifiche / eliminazioni e altre complessità menzionate da @YujiTomita. Se hai davvero bisogno di filtri complessi, controlla django-filtering e aggiungi un pulsante di cancellazione che chiama QuerySet.delete () se l'utente è autorizzato.
Matt Luongo
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.