Видаліть кілька об’єктів у django


107

Мені потрібно вибрати кілька об’єктів, які слід видалити зі своєї бази даних у django за допомогою веб-сторінки. Немає категорії, яку можна вибрати, тому я не можу видалити їх із усіх подібних. Чи потрібно реалізовувати власну форму видалення та обробляти її в django чи у django є спосіб це вже зробити? Як його реалізовано в адміністраторському інтерфейсі.

Відповіді:


202

Ви можете видалити будь-який запит набору QuerySet. Наприклад, для видалення всіх публікацій блогу з деякою моделлю публікації

Post.objects.all().delete()

а також видалити будь-яку публікацію з датою майбутньої публікації

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

Однак вам потрібно придумати спосіб звуження QuerySet. Якщо ви просто хочете, щоб вигляд видалив певний об'єкт, загляньте в загальний вигляд видалення .

Редагувати:

Вибачте за непорозуміння. Я думаю, що відповідь десь посеред. Щоб реалізувати свій власний, комбінуйте поглядиModelForm s та generic . В іншому випадку загляньте у додатки сторонніх розробників, які надають аналогічні функції. У відповідному питанні рекомендація була джанго-фільтром .


1
Ні, ви неправильно зрозуміли питання. Я розумію, що можу все видалити. Але мені потрібно вибрати об’єкти, які потрібно видалити за допомогою форми на веб-сторінці. А потім обробляйте дані, повернені з форми в моєму view.py. Потім прокручуємо те, що повертається у формі, видаляючи як його циклічне перегляд даних. Але я хотів знати, яка найкраща практика для впровадження цього в джанго.
Декан

Ах, моя помилка! Я б або застосував сторонній додаток, або загальні представлення з ModelForms.
Метт Луонго

7
@Dean, поглянь на цей вигляд видалення. Або ви можете просто написати свій власний погляд ... Я маю на увазі, в кінцевому рахунку, ви, ймовірно, отримуєте список ПК та вимагаєте видалити на своїй моделі ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()і я впевнений, що вам потрібно щось переконати, що випадкова людина не може видалити всіх об'єктів у вашій БД, відгадуючи ПК.
Yuji 'Tomita' Tomita

1
@Dean, важко відповісти на ваше запитання, не розуміючи більше про це. Вам просто потрібно створити форму, яка дозволяє користувачеві вибрати правильні критерії видалення (що б там не було - можливо, навіть поле введення, де можна ввести ідентифікаційний номер ... але, мабуть, більш складний), створити подання, яке відповідає на це form, можливо, виконує перевірку (дозволи), а потім, нарешті, запускає цей filter(foo).delete()метод.
Yuji 'Tomita' Tomita

1
Однією з причин цього не відповідає рамки - питання дозволу на редагування / видалення та інші складності, згадані @YujiTomita. Якщо вам дійсно потрібна складна фільтрація, перевірте django-фільтрування та додайте кнопку видалення, яка викликає QuerySet.delete (), якщо користувач має авторизацію.
Метт Луонго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.