Удалить несколько объектов в django

108

Мне нужно выбрать несколько объектов для удаления из моей базы данных в django с помощью веб-страницы. Нет категории для выбора, поэтому я не могу удалить из всех так. Должен ли я реализовать свою собственную форму удаления и обрабатывать ее в django или у django уже есть способ сделать это? Как это реализовано в интерфейсе администратора.

Декан
источник

Ответы:

203

Вы можете удалить любой QuerySet, который хотите. Например, чтобы удалить все сообщения в блоге с некоторой моделью сообщения

Post.objects.all().delete()

и удалить любое сообщение с будущей датой публикации

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

Однако вам нужно найти способ сузить свой QuerySet. Если вы просто хотите, чтобы представление удаляло определенный объект, просмотрите универсальное представление удаления .

РЕДАКТИРОВАТЬ:

Извините за недопонимание. Думаю, ответ где-то посередине. Чтобы реализовать свои собственные, объедините ModelForms и общие представления . В противном случае поищите сторонние приложения, которые предоставляют аналогичные функции. В связанном вопросе рекомендация была django-filter .

Мэтт Луонго
источник
1
Нет, вы неправильно поняли вопрос. Я понимаю, что могу удалить все. Но мне нужно выбрать объекты для удаления с помощью формы на веб-странице. А затем обработайте данные, полученные из формы, в моем views.py. Затем прокрутите то, что было возвращено в форме, удалив ее по циклу через данные. Но я хотел знать, как лучше всего реализовать это в django.
Дин
Ах, моя ошибка! Я бы использовал стороннее приложение или общие представления с ModelForms.
Мэтт Луонго
7
@Dean, взгляни на это представление удаления. Или вы можете просто написать свое собственное представление ... Я имею в виду, что в конечном итоге вы, вероятно, получаете список PK и вызываете удаление в своей модели ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()и я уверен, что вы хотите что-то, чтобы убедиться, что случайный человек не может удалить все объекты в вашей БД, угадывая PK.
Yuji 'Tomita' Tomita
1
@Dean, сложно ответить на ваш вопрос, не понимая больше. Вам просто нужно создать форму, которая позволяет пользователю выбирать правильные критерии удаления (что бы это ни было - возможно, даже поле ввода, в котором вводится идентификационный номер ... но, вероятно, более сложный), построить представление, которое реагирует на это form, возможно, выполняет проверку (разрешения), а затем, наконец, запускает этот filter(foo).delete()метод.
Yuji 'Tomita' Tomita
1
Одна из причин, по которой это не входит в структуру, - это вопрос авторизации для редактирования / удаления и другие сложности, упомянутые @YujiTomita. Если вам действительно нужна сложная фильтрация, проверьте django-filtering и добавьте кнопку удаления, которая вызывает QuerySet.delete (), если пользователь авторизован.
Мэтт Луонго