Ускорение страницы удаления администратора Django - PullRequest
5 голосов
/ 07 мая 2011

Как бы вы ускорили действие / страницу удаления записи администратора Django?

У меня есть модель B с ограничением внешнего ключа для модели A. Для каждой записи в A имеется около 10 тыс. Записей в B, связанных с A. Поэтому, когда мне нужно удалить запись в A, используя стандартное значение «Удалить выбранное» «Действие в админке, Django займет 15 минут, чтобы запросить и отобразить каждую удаляемую запись в B. Как бы я изменил это так, чтобы вместо перечисления тысяч зависимых объектов он отображал только количество удаленных зависимых объектов?

Ответы [ 2 ]

8 голосов
/ 07 мая 2011

Как обычно, просмотрите исходный код django, чтобы найти ваш ответ (он удивительно читаем с переменными, функциями, классами и файлами, названными логически).

Глядя на django/contrib/admin/templates/admin/delete_confirmation.html (в django 1.2.5), вы увидите шаблон с 24-й строкой, содержащий:

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

Если вы измените это на

<p>{{ deleted_objects|count }} objects</p>

или

{% if 100 < deleted_objects|count %}
    <p>{{ deleted_objects|count }} objects</p>
{% else %}
    <ul>{{ deleted_objects|unordered_list }}</ul>
{% endif %}

будет отображаться только количество удаленных объектов (если имеется много удаленных объектов).

Вы также можете поэкспериментировать с редактированием django/contrib/admin/templates/admin/actions.pyиспользовать транзакцию SQL для ускорения массового удаления.См .: http://docs.djangoproject.com/en/dev/topics/db/transactions/

В основном action.py в настоящее время работает, формируя соответствующий набор запросов, вызывая delete () непосредственно из набора запросов, но не группируя его в одну транзакцию БД.Выполняя простые временные тесты на примере базы данных sqlite, я обнаружил, что удаление ~ 150 объектов без транзакций заняло 11,3 секунды с использованием qs.delete() и 13,4 секунды с использованием for obj in qs: obj.delete().Используя транзакции (@transaction.commit_on_success перед удалением функций), те же самые команды занимали всего 0,35 секунды и 0,39 секунды (примерно в 30 раз быстрее).Предоставление транзакций может временно заблокировать базу данных, что может быть неприемлемым вариантом.

Для разумного расширения администратора django (обычно вы не хотите редактировать источник напрямую, особенно если другие пользователи используют тот жефайлы или если вы когда-нибудь захотите вернуться позже или запустите другие сайты django на той же машине), см .: http://www.djangobook.com/en/1.0/chapter17/#cn35

0 голосов
/ 29 января 2013

Для Джанго 1.4 рецепт @ drjimbob немного отличается:

Обновить файл:

django/contrib/admin/templates/admin/delete_selected_confirmation.html

и в строке 35 заменить

{% for deletable_object in deletable_objects %}
    <ul>{{ deletable_object|unordered_list }}</ul>
{% endfor %}

для

{% for deletable_object in deletable_objects %}
    {% if 100 < deletable_object|length %}
        <p>{{ deletable_object|length }} objects</p>
    {% else %}
        <ul>{{ deletable_object|unordered_list }}</ul>
    {% endif %}
{% endfor %} 
...