django django-1.5

Error de integridad en django_admin_log después de actualizar el sitio existente al nuevo modelo de usuario de Django 1.5



django-1.5 (6)

Creo que la aplicación de administración solo instala la tabla django_admin_log.

python manage.py sqlclear admin BEGIN; DROP TABLE "django_admin_log"; COMMIT;

Así que también puedes intentarlo.

python manage.py sqlclear admin | python manage.py dbshell python manage.py syncdb

Aparentemente, después de agregar mi nueva tabla de usuarios al sitio, django_admin_log todavía tiene una tabla de FK a auth_user. ¿Alguna forma de abordar esto? No vi este problema en la puesta en escena o localmente, así que algo extraño debe haber ocurrido.

Traceback (última llamada más reciente) :

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", línea 115, en get_response response = callback (solicitud, * callback_args, ** callback_kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/api/object_wrapper.py", línea 220, en la llamada self._nr_instance, args, kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/framework_django.py", línea 475, envuelta en el envoltorio (* args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/options.py", línea 372, en el envoltorio, devuelva self.admin_site.admin_view (ver) (* args, * * kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", línea 91, en _wrapped_view response = view_func (solicitud, * args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/cache.py", línea 89, en _wrapped_view_func response = view_func (request, * args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/sites.py", línea 202, en vista de retorno interno (solicitud, * args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", línea 25, en _wrapper return bound_func (* args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", línea 91, en _wrapped_view response = view_func (solicitud, * args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", línea 21, en bound_func return func (self, * args2, ** kwargs2)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", línea 223, en la función de retorno interno (* args, ** kwargs)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", línea 217, en exit self.exiting (exc_value, self.using)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", línea 281, al salir de commit (utilizando = using)

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", línea 152, en commit connection.commit ()

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/ init .py", línea 241, en commit self._commit ()

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", línea 242, en _commit six.reraise (utils.IntegrityError, utils.IntegrityError ( * tuple (e.args)), sys.exc_info () [2])

Archivo "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", línea 240, en _commit return self.connection.commit ()

Archivo "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/database_dbapi2.py", línea 68, en confirmación de devolución self._nr_connection.commit ()

IntegrityError: insertar o actualizar en la tabla "django_admin_log" viola la restricción de clave foránea "django_admin_log_user_id_fkey" DETALLE: La clave (user_id) = (2) no está presente en la tabla "auth_user".


Elimine la base de datos y cree un superusuario, finalmente ejecute migrate :

python manage.py createsuperuser python manage.py migrate


Parece que puede haber habido una transacción incorrecta como un momento en el que ejecutó esto, podría intentar restablecer completamente su base de datos con:

heroku pg:reset

O puede intentar hacer psql en la base de datos y examinar / corregir los datos que crean el problema (que es probable que intente insertar el mismo usuario dos veces):

heroku pg:psql


Si está en Django 1.7 o posterior, agregar una migración adecuada para modificar la tabla django_admin_log es una opción mucho mejor en mi opinión. De esa manera, puede mantener cualquier entrada de registro existente, que en realidad puede ser algo para lo que tenga uso. Hacer tal alteración requiere que el campo de identificación sea el mismo, por ejemplo, tenga el mismo nombre, etc.

Primero tendrá que averiguar el nombre de la restricción, que se puede hacer ingresando al shell de la base de datos:

./manage.py dbshell

Y luego describiendo la tabla django_admin_log :

/d+ django_admin_log;

Esto tendrá la restricción en la salida, algo así como:

"user_id_refs_id_c0d12874" FOREIGN KEY (user_id) REFERENCES my_custom_auth_model(id) DEFERRABLE INITIALLY DEFERRED

Donde my_custom_auth_model es el nombre de la tabla donde vive su modelo de autenticación personalizado, y user_id_refs_id_c0d12874 es el nombre de la restricción, que debe copiar para más adelante.

A continuación, crea una nueva migración:

./manage makemigrations --empty my_custom_auth_model

0000_alter_admin_log_constraint.py nombre de mi nueva migración (es decir, 0000_alter_admin_log_constraint.py ) para tener algo útil en lugar de una marca de fecha en el nombre del archivo. Sin embargo, no use cuatro ceros, use lo que se asignó al crear la migración :)

En la nueva migración, esto es lo que usé para las operaciones:

operations = [ migrations.RunSQL( ''''''ALTER TABLE django_admin_log DROP CONSTRAINT user_id_refs_id_c0d12874'''''', reverse_sql=''''''ALTER TABLE django_admin_log ADD CONSTRAINT user_id_refs_id_c0d12874 FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED''''''), migrations.RunSQL( ''''''ALTER TABLE django_admin_log ADD CONSTRAINT user_id_refs_id_c0d12874 FOREIGN KEY (user_id) REFERENCES my_custom_auth_model(id) DEFERRABLE INITIALLY DEFERRED'''''', reverse_sql=''''''ALTER TABLE django_admin_log DROP CONSTRAINT user_id_refs_id_c0d12874''''''), ]

Sustituya user_id_refs_id_c0d12874 con el nombre de restricción que haya copiado anteriormente. Como puede ver, las dos operaciones y sus reveses son inversos entre sí, lo que significa que también puede mover estas migraciones hacia atrás.

Ahora, todo lo que tienes que hacer es aplicar la nueva migración:

./manage.py migrate

La tabla django_admin_log ahora debería poder usarse nuevamente, y cualquier cosa que escriba el administrador en ella funcionará en lugar de fallar con un IntegrityError .


Si te encuentras con esto y estás usando> = 1.7:

./manage.py dbshell DROP TABLE django_admin_log;

y entonces:

./manage.py sqlmigrate admin 0001 | ./manage.py dbshell


Esto se debe a que la tabla django_admin_log aún contiene una relación de clave externa a la antigua tabla auth_user .

Necesitas soltar esto y recrear la tabla.

$ heroku pg:psql psql => drop table django_admin_log;

Para Django <1.7

$ heroku run python manage.py syncdb

Y para Django> = 1.7

$ ./manage.py sqlmigrate admin 0001 | heroku pg:psql

Y eso es :)

EDITADO con @dustinfarris Django 1.7+ precisión de respuesta