Ben*_*rts 26 django django-1.5
加入我的新用户表到现场后,显然,django_admin_log仍然有FK到AUTH_USER表.有没有办法解决这个问题?我没有在升级或本地看到这个问题所以必须发生奇怪的事情.
Traceback(最近一次调用最后一次):
在get_response response = callback(request,*callback_args,**callback_kwargs)中输入文件"/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py",第115行
文件"/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行,在包装器中返回self.admin_site.admin_view(view)(*args,**kwargs)
文件"/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py",第91行,在_wrapped_view response = view_func(request,*args,**kwargs)
文件"/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/cache.py",第89行,在_wrapped_view_func response = view_func(request,*args,**kwargs)
在内部返回视图中输入文件"/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/sites.py",第202行(request,*args,**kwargs)
文件"/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py",第25行,在_wrapper中返回bound_func(*args,**kwargs)
文件"/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py",第91行,在_wrapped_view 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行,内部返回功能(*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行,退出提交(using = using)
提交connection.com()中的文件"/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py",第152行
文件"/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/ INIT py"为,线241,在提交self._commit()
文件"/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py",第242行,在_commit six.reraise(utils.IntegrityError,utils.IntegrityError(*tuple(e.args)),sys.exc_info()[2])
文件"/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py",第240行,在_commit中返回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"DETAIL:表("auth_user")中不存在键(user_id)=(2).
dus*_*ris 34
如果你碰到这个并且你正在使用> = 1.7:
./manage.py dbshell
DROP TABLE django_admin_log;
Run Code Online (Sandbox Code Playgroud)
然后:
./manage.py sqlmigrate admin 0001 | ./manage.py dbshell
Run Code Online (Sandbox Code Playgroud)
dul*_*ccc 20
因为该django_admin_log表仍包含与旧auth_user表的外键关系.
您需要删除它并重新创建表.
$ heroku pg:psql
psql => drop table django_admin_log;
Run Code Online (Sandbox Code Playgroud)
对于Django <1.7
$ heroku run python manage.py syncdb
Run Code Online (Sandbox Code Playgroud)
而对于Django> = 1.7
$ ./manage.py sqlmigrate admin 0001 | heroku pg:psql
Run Code Online (Sandbox Code Playgroud)
就是这样:)
编辑@dustinfarris Django 1.7+答案精度
如果您使用的是Django 1.7或更高版本,django_admin_log在我看来,添加适当的迁移来更改表格是一个更好的选择.这样你就可以保留任何现有的日志条目,这可能实际上是你用过的东西.执行此类更改需要id字段相同,例如具有相同的名称等.
首先,您必须找出约束的名称,这可以通过进入数据库shell来完成:
./manage.py dbshell
Run Code Online (Sandbox Code Playgroud)
然后描述django_admin_log表:
\d+ django_admin_log;
Run Code Online (Sandbox Code Playgroud)
这将在输出中具有约束,例如:
"user_id_refs_id_c0d12874" FOREIGN KEY (user_id) REFERENCES my_custom_auth_model(id) DEFERRABLE INITIALLY DEFERRED
Run Code Online (Sandbox Code Playgroud)
哪里my_custom_auth_model是你的自定义的身份验证模式生活在表的名称,user_id_refs_id_c0d12874是约束,你应该为以后副本的名称.
接下来,创建一个新的迁移:
./manage makemigrations --empty my_custom_auth_model
Run Code Online (Sandbox Code Playgroud)
我重命名了我的新迁移(即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'''),
]
Run Code Online (Sandbox Code Playgroud)
替换user_id_refs_id_c0d12874您先前复制的任何约束名称.如您所见,这两个操作及其反转是彼此的反转,这意味着您也可以向后移动此迁移.
现在,您所要做的就是应用新的迁移:
./manage.py migrate
Run Code Online (Sandbox Code Playgroud)
该django_admin_log表现在应该可以再次使用,并且管理员写入它的任何内容都将起作用而不是失败IntegrityError.