Erreur d'intégrité sur le journal d'administration django après la mise à jour du site existant vers le nouveau modèle D'utilisateur Django 1.5

Apparemment, après avoir ajouté ma nouvelle table utilisateur au site, django_admin_log a toujours un FK à la table auth_user. De toute façon pour remédier à cela? Je n'ai pas vu ce problème dans la mise en scène ou localement, donc quelque chose d'étrange a dû avoir lieu.

Traceback (dernier appel le plus récent) :

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", ligne 115, dans get_response réponse = rappel(demande, * callback_args, **callback_kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/api/object_wrapper.py", ligne 220, dans appel auto._nr_instance, args, kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/framework_django.py", ligne 475, dans l'emballage retour enveloppé(*args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/options.py", ligne 372, en emballage retour auto.admin_site.admin_view(avis)(*args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", ligne 91, dans _wrapped_view réponse = view_func(demande, *args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/cache.py", ligne 89, dans _wrapped_view_func réponse = view_func(demande, *args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/sites.py", ligne 202, en intérieur retour Vue (demande, *args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", ligne 25, dans _wrapper retour bound_func (*args, * * kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", ligne 91, dans _wrapped_view réponse = view_func(demande, *args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", ligne 21, dans bound_func retour func (self, * args2, * * kwargs2)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", ligne 223, à l'intérieur retour func(*args, **kwargs)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", la ligne 217, dans exit auto.la sortie(exc_value, de soi.en utilisant)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", ligne 281, en sortie s'engager(à l'aide d'=aide)

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", ligne 152, dans commit connexion.commit ()

Fichier "/ app/. heroku / Python / lib / python2. 7 / site-packages / django / db / backends / init . py", ligne 241, dans commit auto._commit ()

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", ligne 242, dans _commit six.sur-relancer(utils.IntegrityError, utils.IntegrityError (*tuple (E. args)), sys.exc_info () [2])

Fichier "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", ligne 240, dans _commit retour auto.connexion.commit ()

Fichier "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/database_dbapi2.py", ligne 68, dans commit retour auto._nr_connection.commit ()

IntegrityError: insérer ou mettre à jour sur la table "django_admin_log" viole la contrainte de clé étrangère " django_admin_log_user_id_fkey" DÉTAIL: Clé (user_id)=(2) n'est pas présent dans la table "auth_user".

24
demandé sur Amith 2013-02-28 03:23:08

6 réponses

Cela parce que la table django_admin_log contient toujours une relation de clé étrangère avec l'ancienne table auth_user.

Vous devez supprimer ceci et recréer la table.

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

Pour Django

$ heroku run python manage.py syncdb

Et pour Django > = 1.7

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

Et c'est tout :)

Édité avec @ dustinfarris Django 1.7 + précision de réponse

18
répondu dulaccc 2015-07-25 11:13:34

Si vous rencontrez ceci et que vous utilisez > = 1.7:

./manage.py dbshell

DROP TABLE django_admin_log;

Puis:

./manage.py sqlmigrate admin 0001 | ./manage.py dbshell
30
répondu dustinfarris 2014-08-15 17:31:55

Si vous êtes sur Django 1.7 ou version ultérieure, ajouter une migration appropriée pour modifier la table django_admin_log est une bien meilleure option à mon avis. De cette façon, vous pouvez conserver toutes les entrées de journal existantes, ce qui peut être quelque chose que vous avez utilisé. Faire une telle modification nécessite que le champ id soit le même, par exemple a le même nom, etc.

Vous devrez D'abord trouver le nom de la contrainte, ce qui peut être fait en allant dans le shell de la base de données:

./manage.py dbshell

Puis décrivant le django_admin_log tableau:

\d+ django_admin_log;

Cela aura la contrainte dans la sortie, quelque chose comme:

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

my_custom_auth_model est le nom de la table où vit votre modèle d'authentification personnalisé, et user_id_refs_id_c0d12874 est le nom de la contrainte, que vous devriez Copier pour plus tard.

Ensuite, créez une nouvelle migration:

./manage makemigrations --empty my_custom_auth_model

J'ai renommé ma nouvelle migration (c'est-à-dire 0000_alter_admin_log_constraint.py) pour avoir quelque chose d'utile au lieu d'un datestamp dans le nom de fichier. N'utilisez pas quatre zéros, utilisez tout ce qui a été assigné lors de la création du migration:)

Dans la nouvelle migration, c'est ce que j'ai utilisé pour les opérations:

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'''),
]

Remplacez user_id_refs_id_c0d12874 par le nom de contrainte que vous avez copié précédemment. Comme vous pouvez le voir, les deux opérations et leurs inversions sont des inverses l'une de l'autre, ce qui signifie que vous pouvez également déplacer ces migrations vers l'arrière.

Maintenant, tout ce que vous avez à faire est d'appliquer les nouvelles migrations:

./manage.py migrate

La table django_admin_log devrait maintenant être utilisable à nouveau, et tout ce qui est écrit par l'administrateur fonctionnera à la place d'échouer avec un IntegrityError.

6
répondu Markus Amalthea Magnuson 2014-11-19 22:21:56

Il semble qu'il y ait eu une mauvaise transaction à un moment donné lorsque vous avez exécuté ceci, vous pouvez essayer de réinitialiser complètement votre base de données avec:

heroku pg:reset

Ou vous pouvez essayer de psql dans la base de données et examiner / corriger les données qui créent le problème (ce qui est probable qu'il essaie d'insérer le même utilisateur deux fois):

heroku pg:psql
0
répondu CraigKerstiens 2013-03-03 05:02:56

Je pense que l'application admin installe uniquement la table django_admin_log.

python manage.py sqlclear admin

BEGIN;
DROP TABLE "django_admin_log";

COMMIT;

Donc, vous pouvez également essayer.

python manage.py sqlclear admin | python manage.py dbshell
python manage.py syncdb
0
répondu Arthur Alvim 2014-03-17 13:59:19

Supprimez la base de données et créez un superutilisateur, enfin exécutez migrate:

python manage.py createsuperuser    
python manage.py migrate
0
répondu Weipeng Liu 2018-03-23 17:43:02