【问题标题】:can't delete user after removing app删除应用后无法删除用户
【发布时间】:2015-12-05 23:49:29
【问题描述】:

我有一个 django 项目,其中包含许多不同的应用程序。我们删除了其中一个应用程序,现在当我们尝试删除用户时它失败了,抱怨该应用程序中的表不存在。任何地方都没有对该应用程序或表格的引用。测试,我发现如果我创建表,错误就会消失。

在谷歌搜索和四处搜索之后,我认为我已经弄清楚了。该应用程序在 django_content_type 中被引用,而 content_type_id 在 auth_permission 中被引用。因此,我从 auth_permission 和 auth_permission 中删除了具有该 content_type_id 的行,但我仍然收到错误消息。

我需要怎么做才能删除对此应用的引用,以便删除用户?

这是完整的堆栈跟踪:

Traceback:
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/options.py" in wrapper
  372.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/sites.py" in inner
  202.             return view(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapper
  25.             return bound_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/utils/decorators.py" in bound_func
  21.                 return func(self, *args2, **kwargs2)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/options.py" in changelist_view
  1205.                 response = self.response_action(request, queryset=cl.get_query_set(request))
File "/usr/lib/python2.6/site-packages/django/contrib/admin/options.py" in response_action
  960.             response = func(self, request, queryset)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/actions.py" in delete_selected
  35.         queryset, opts, request.user, modeladmin.admin_site, using)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/util.py" in get_deleted_objects
  109.     collector.collect(objs)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/util.py" in collect
  160.             return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs)
File "/usr/lib/python2.6/site-packages/django/db/models/deletion.py" in collect
  225.                 elif sub_objs:
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in __nonzero__
  141.         return type(self).__bool__(self)
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in __bool__
  135.             next(iter(self))
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in _result_iter
  123.                 self._fill_cache()
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in _fill_cache
  927.                     self._result_cache.append(next(self._iter))
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in iterator
  301.         for row in compiler.results_iter():
File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in results_iter
  775.         for rows in self.execute_sql(MULTI):
File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in execute_sql
  840.         cursor.execute(sql, params)
File "/usr/lib/python2.6/site-packages/django/db/backends/util.py" in execute
  41.             return self.cursor.execute(sql, params)
File "/usr/lib/python2.6/site-packages/django/db/backends/mysql/base.py" in execute
  130.             six.reraise(utils.DatabaseError, utils.DatabaseError(*tuple(e.args)), sys.exc_info()[2])
File "/usr/lib/python2.6/site-packages/django/db/backends/mysql/base.py" in execute
  120.             return self.cursor.execute(query, args)
File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py" in execute
  173.             self.errorhandler(self, exc, value)
File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py" in defaulterrorhandler
  36.     raise errorclass, errorvalue

Exception Type: DatabaseError at /admin/auth/user/
Exception Value: (1146, "Table 'motor.reflection_resource_listeners' doesn't exist")

【问题讨论】:

  • 你有什么不寻常的缓存设置吗?
  • 启用 django 查询日志记录并查看正在执行的 equery(记录器中的 django.db.backends)。您可能已经能够在 mysql 日志中看到查询
  • 谢谢。我什至不知道 django 查询日志。我通常只使用蛮力(和 pdb)来查找查询。我会调查的。

标签: python django django-admin django-orm


【解决方案1】:

要从 Django 中完全删除应用程序,您需要执行以下步骤:

  1. 从所有其他应用程序和模型中删除对该应用程序的任何引用,进行迁移并应用它们。 (这将删除与您要删除的模型的所有外键关系)

  2. 注释掉您要删除的应用程序的所有模型,然后进行迁移并应用它们。 (这将删除您要删除的模型的所有表)

  3. 在其他应用中的所有引用都被删除并且应用本身没有模型后,您可以删除整个应用的文件。

  4. 最后,您需要删除在初始迁移运行时创建的所有 ContentType 条目。您可以通过运行此处找到的脚本来执行此操作:Remove Content Types

【讨论】:

  • 感谢您的回复。我已经完成了前 3 个步骤。这是我需要做的第四步。
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 2018-02-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多