Как я могу справиться с массовым удалением из Django Admin? - PullRequest
2 голосов
/ 18 февраля 2020

Я работаю с Django 2.2.10.

У меня есть модель с именем Site и модель с именем Record. Каждая запись связана с одним сайтом (внешний ключ).

После того, как мое приложение работает в течение нескольких дней / недель / месяцев, с каждым сайтом могут быть связаны тысячи записей. Я эффективно использую базу данных, поэтому обычно это не проблема.

В Django Администратор, однако когда я пытаюсь удалить сайт, Django Администратор пытается выяснить каждый связанный объект, который будет также будет удален, и поскольку мой ForeignKey использует on_delete=models.CASCADE, что я и хочу, он пытается создать страницу, на которой перечислены тысячи, возможно, миллионы записей, которые будут удалены. Иногда это удается, но занимает несколько секунд. Иногда браузер просто перестает ждать.

Как я могу Django Admin не перечислять каждый record, который он намеревается удалить? Может быть, просто скажите что-то вроде «x количество записей будет удалено».

Обновление: Должен ли я переопределять Django admin delete_confirmation. html? Похоже, виновником может быть эта строка:

<ul>{{ deleted_objects|unordered_list }}</ul>

Или есть где-то опция, которую можно включить, чтобы автоматически не перечислять каждый отдельный объект, который нужно удалить, возможно, если число объектов превышает X число объекты?

Обновление 2: удаление вышеуказанной строки из delete_confirmation. html не помогло. Я думаю, что это представление, которое генерирует переменную delete_objects, которая занимает слишком много времени. Не совсем уверен, как переопределить Django представление администратора

1 Ответ

1 голос
/ 18 февраля 2020

Добавьте это в свой класс администратора, и затем вы можете удалить это действие без предупреждения

  actions = ["silent_delete"]

  def silent_delete(self, request, queryset):
    queryset.delete()

Если вы хотите скрыть действие по умолчанию для удаления, добавьте это в свой класс администратора

  def get_actions(self, request):
    actions = super().get_actions(request)
    if 'delete_selected' in actions:
      del actions['delete_selected']
    return actions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...