2011-05-06 20 views
5

¿Cómo aceleraría la acción/página de eliminación de registros Admin de Django?Acelerando la página de eliminación Admin de Django

Tengo un modelo B con una restricción de clave externa para el modelo A. Para cada registro en A, hay aproximadamente 10k registros en B vinculados a A. Así que cuando tengo que eliminar un registro en A usando el valor predeterminado "Eliminar A la acción A en "admin" seleccionada, Django tardará 15 minutos en consultar y visualizar cada registro que se borre en B. ¿Cómo puedo modificar esto para que en lugar de enumerar miles de objetos dependientes, solo muestre un recuento de los objetos dependientes que se eliminan?

Respuesta

8

Como de costumbre, navegue por la fuente django para encontrar su respuesta (es sorprendentemente legible con variables, funciones, clases y archivos nombrados lógicamente).

En cuanto a django/contrib/admin/templates/admin/delete_confirmation.html (en django 1.2.5), verá una plantilla que tiene la línea 24 contiene:

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

Si cambia esta decir

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

o

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

solo mostrará el recuento de objetos eliminados (si hay muchos objetos eliminados) .

Es posible que también desee experimentar con la edición django/contrib/admin/templates/admin/actions.py para usar una transacción SQL para realizar la eliminación masiva más rápidamente. Ver: http://docs.djangoproject.com/en/dev/topics/db/transactions/

Básicamente, action.py funciona actualmente formando el conjunto de consultas apropiado, llamando a delete() directamente el conjunto de consultas, pero no agrupando en una sola transacción db. Haciendo pruebas simples de tiempo en una base de datos sqlite de ejemplo encontré que borrar ~ 150 objetos sin transacciones tomó 11.3 segundos usando qs.delete() y 13.4 segundos usando for obj in qs: obj.delete(). Usando transacciones (@transaction.commit_on_success antes de las funciones de eliminación), los mismos comandos tomaron solo 0,35 segundos y 0,39 segundos (aproximadamente 30 veces más rápido). El uso de transacciones otorgadas puede bloquear la base de datos temporalmente, lo que puede no ser una opción aceptable.

Extender la administración de Django con sensatez (normalmente no quiere editar la fuente directamente; especialmente si otros usuarios están utilizando los mismos archivos o si puede que nunca querrá volver tarde o está ejecutando otros sitios sobre Django misma máquina) ver: http://www.djangobook.com/en/1.0/chapter17/#cn35

+0

Esto ayuda- pero la otra gran hangup está en el django.contrib.admin.actions.py donde se hace la llamada a get_deleted_objects (línea 34 en django 1.4). Aquí, la jerarquía completa de objetos se compila para su posterior visualización en la plantilla. Aquí es donde mi código colgaba al menos. Espero que esto también ayude. – Rob

0

Para Django 1.4 @ receta de drjimbob es ligeramente diferente:

actualización del archivo:

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

y en la línea 35 reemplazar

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

para

{% 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 %}