Eliminar varios objetos en django

104

Necesito seleccionar varios objetos para eliminarlos de mi base de datos en django usando una página web. No hay una categoría para seleccionar, así que no puedo eliminarlas de todas de esa manera. ¿Tengo que implementar mi propio formulario de eliminación y procesarlo en django o django ya tiene una forma de hacer esto? Como está implementado en la interfaz de administración.

Decano
fuente

Respuestas:

200

Puede eliminar cualquier QuerySet que desee. Por ejemplo, para eliminar todas las publicaciones de blog con algún modelo de publicación

Post.objects.all().delete()

y para eliminar cualquier publicación con una fecha de publicación futura

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

Sin embargo, necesita encontrar una forma de reducir su QuerySet. Si solo desea una vista para eliminar un objeto en particular, busque en la vista genérica de eliminación .

EDITAR:

Perdón por el malentendido. Creo que la respuesta está en algún punto intermedio. Para implementar la suya propia, combine ModelFormsy vistas genéricas . De lo contrario, busque aplicaciones de terceros que brinden una funcionalidad similar. En una pregunta relacionada , la recomendación fue django-filter .

Matt Luongo
fuente
1
No, has entendido mal la pregunta. Entiendo que puedo borrar todo. Pero necesito seleccionar los objetos para eliminar con un formulario en una página web. Y luego procese los datos devueltos desde el formulario en mi views.py. Luego, recorra lo que se devolvió en el formulario eliminando a medida que recorre los datos. Pero quería saber cuál es la mejor práctica para implementar esto en django.
Dean
¡Ah, mi error! Usaría una aplicación de terceros o vistas genéricas con ModelForms.
Matt Luongo
7
@ Dean, echa un vistazo a esa vista de eliminación. O simplemente puede escribir su propia vista ... quiero decir, en última instancia, probablemente esté recibiendo una lista de PK y llamando a eliminar en su modelo ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()y estoy seguro de que desea algo para asegurarse de que una persona aleatoria no pueda eliminar todo objetos en su base de datos adivinando PK.
Yuji 'Tomita' Tomita
1
@ Dean, es difícil responder a tu pregunta sin entender más sobre ella. Solo necesita crear un formulario que le permita al usuario seleccionar los criterios de eliminación correctos (cualquiera que sea, tal vez incluso un cuadro de entrada donde se escribe un número de identificación ... pero probablemente más complejo), construir una vista que responda a eso formulario, quizás realiza la validación (permisos), y finalmente ejecuta ese filter(foo).delete()método.
Yuji 'Tomita' Tomita
1
Una de las razones por las que esto no viene con el marco es la cuestión de la autorización para ediciones / eliminación y otras complejidades mencionadas por @YujiTomita. Si realmente necesita un filtrado complejo, consulte django-filtering y agregue un botón de eliminación que llame a QuerySet.delete () si el usuario está autorizado.
Matt Luongo