2009-02-27 13 views
6

De vez en cuando, necesita cambiar el nombre de un modelo en Django (o, en un caso reciente que encontré, dividir un modelo en dos, con nombres nuevos/diferentes) . Sí, la planificación adecuada ayuda a evitar esta situación, pero a veces la realidad interviene.Reparar la tabla auth_permission después de cambiar el nombre de un modelo en Django

Después de cambiar el nombre de las tablas correspondientes en el archivo db y corregir el código afectado, queda un problema: Todos los permisos otorgados a Usuarios o Grupos para operar en esos modelos todavía hacen referencia a los nombres del modelo anterior. ¿Hay alguna manera automática o semiautomatizada de solucionar esto, o es solo una cuestión de cirugía de db manual? (en desarrollo puede colocar la tabla auth_permissions y syncdb para recrearla, pero la producción no es tan simple).

Respuesta

0

Llegué aproximadamente a la mitad de una larga respuesta que detallaba el plan de ataque que tomaría en esta situación, pero mientras escribía me di cuenta de que probablemente no haya forma de tener que hacer un mantenimiento en este situación.

Puede minimizar el tiempo de inactividad teniendo un script de carga de datos preparado, por supuesto, aunque debe tenerse cuidado para asegurarse de que las claves de auth_perms estén sincronizadas.

También vea la respuesta breve: no hay forma automática de hacer esto de la que tengo conocimiento.

2

Aquí está a snippet que completa los tipos de contenido perdidos y los permisos. Me pregunto si podría extenderse para al menos hacer algo del trabajo de burro para limpiar auth_permissions.

+0

Nota esta versión de la secuencia de comandos no funciona con Django 1.0 - usar http://www.djangosnippets.org/snippets/696/en su lugar. – shacker

2

Si le pasó a haber utilizado una migración del esquema del Sur para cambiar el nombre de la tabla, la siguiente línea en la migración hacia adelante habría hecho esto de forma automática:

db.send_create_signal('appname', ['modelname']) 
+0

¡Esto funciona maravillosamente! – gaqzi

1

Recientemente tuve este problema y escribí una función de resolver eso. Normalmente tendrá una discrepancia con las tablas ContentType y Permission si cambia el nombre de un modelo/tabla. Django se ha incorporado en funciones de ayuda para resolver el problema y se puede utilizar como sigue:

from django.contrib.auth.management import create_permissions 
from django.contrib.contenttypes.management import update_all_contenttypes 
from django.db.models import get_apps 

def update_all_content_types_and_permissions(): 
    for app in get_apps(): 
     create_permissions(app, None, 2) 
    update_all_contenttypes() 
+0

no funciona en mi caso (Django 1.7): el objeto ''módulo 'no tiene atributo' models_module'' – linqu

Cuestiones relacionadas