27

显然,在将我的新用户表添加到站点后,django_admin_log 仍然具有到 auth_user 表的 FK。有什么办法解决这个问题吗?我在分期或本地没有看到这个问题,所以一定发生了一些奇怪的事情。

Traceback(最近一次通话最后一次)

文件“/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py”,第 115 行,在 get_response response = callback(request, *callback_args, **callback_kwargs)

文件“/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/api/object_wrapper.py”,第 220 行,调用 self._nr_instance,args,kwargs)

包装器中的文件“/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/framework_django.py”,第 475 行,返回已包装(*args,**kwargs)

包装器中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/options.py”,第 372 行 return self.admin_site.admin_view(view)(*args, * *夸格斯)

_wrapped_view 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py”,第 91 行 response = view_func(request, *args, **kwargs)

_wrapped_view_func 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/cache.py”,第 89 行 response = view_func(request, *args, **kwargs)

内部返回视图中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/sites.py”,第 202 行(请求,*args,**kwargs)

_wrapper 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py”,第 25 行 return bound_func(*args, **kwargs)

_wrapped_view 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py”,第 91 行 response = view_func(request, *args, **kwargs)

文件“/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py”,第 21 行,在 bound_func 返回 func(self, *args2, **kwargs2)

文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py”,第 223 行,内部返回 func(*args, **kwargs)

文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py”,第 217 行,退出 self.exiting(exc_value, self.using)

退出提交中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py”,第 281 行(使用=使用)

提交 connection.commit() 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py”,第 152 行

提交self._commit () 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/init .py”,第 241 行

文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py”,第 242 行,在 _commit *tuple(e.args)), sys.exc_info()[2])

_commit 中的文件“/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py”,第 240 行,返回 self.connection.commit()

提交中的文件“/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/database_dbapi2.py”,第 68 行,返回 self._nr_connection.commit()

IntegrityError:在表“django_admin_log”上插入或更新违反了外键约束“django_admin_log_user_id_fkey”详细信息:表“auth_user”中不存在键(user_id)=(2)。

4

6 回答 6

37

如果您遇到这种情况并且您正在使用 >=1.7:

./manage.py dbshell

DROP TABLE django_admin_log;

进而:

./manage.py sqlmigrate admin 0001 | ./manage.py dbshell
于 2014-08-15T17:31:55.480 回答
20

那是因为该django_admin_log表仍然包含与旧表的外键关系auth_user

您需要删除它并重新创建表。

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

对于 Django < 1.7

$ heroku run python manage.py syncdb

对于 Django >= 1.7

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

就是这样:)

编辑@dustinfarris Django 1.7+ 答案精度

于 2013-11-20T11:36:56.760 回答
7

如果您使用的是 Django 1.7 或更高版本,django_admin_log我认为添加适当的迁移以更改表是一个更好的选择。这样您就可以保留任何现有的日志条目,这实际上可能是您使用的东西。进行这样的更改需要 id 字段相同,例如具有相同的名称等。

首先,您必须找出约束的名称,这可以通过进入数据库 shell 来完成:

./manage.py dbshell

然后描述django_admin_log表:

\d+ django_admin_log;

这将在输出中有约束,例如:

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

wheremy_custom_auth_model是您的自定义身份验证模型所在的表的名称,并且user_id_refs_id_c0d12874是约束的名称,您应该稍后复制它。

接下来,创建一个新的迁移:

./manage makemigrations --empty my_custom_auth_model

我重命名了我的新迁移(即0000_alter_admin_log_constraint.py)以在文件名中包含有用的东西而不是日期戳。但是不要使用四个零,使用创建迁移时分配的任何内容:)

在新的迁移中,这是我用于操作的:

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

替换user_id_refs_id_c0d12874为您之前复制的任何约束名称。如您所见,这两个操作及其逆操作是互逆的,这意味着您也可以将此迁移向后移动。

现在,您所要做的就是应用新的迁移:

./manage.py migrate

django_admin_log表现在应该可以再次使用,并且管理员向它写入的任何内容都可以正常工作,而不是使用IntegrityError.

于 2014-11-19T22:21:56.593 回答
0

当您运行此操作时,似乎可能存在错误事务,您可以尝试使用以下命令完全重置您的数据库:

heroku pg:reset

或者您可以尝试将 psql 插入数据库并检查/更正导致问题的数据(这可能是它尝试两次插入同一个用户):

heroku pg:psql
于 2013-03-03T05:02:56.920 回答
0

我认为管理应用程序只安装 django_admin_log 表。

python manage.py sqlclear admin

BEGIN;
DROP TABLE "django_admin_log";

COMMIT;

所以你也可以试试。

python manage.py sqlclear admin | python manage.py dbshell
python manage.py syncdb
于 2014-03-17T13:59:19.780 回答
-1

删除数据库并创建一个超级用户,最后运行migrate

python manage.py createsuperuser    
python manage.py migrate
于 2018-03-23T14:05:55.540 回答