【问题标题】:Django not creating tables for my custom user modelsDjango 没有为我的自定义用户模型创建表
【发布时间】:2013-06-20 15:29:43
【问题描述】:

使用 Django 1.5,尝试自定义用户功能。

我在项目中只有 3 个模型。他们来了,

class CustomUser(AbstractBaseUser, PermissionsMixin):
class CustomUserManager(BaseUserManager):
class testModel (models.Model):

python manage.py validate 时没有错误。当我执行python manage.py sqlall lancer(lancer 是应用程序的名称)时,它会显示以下内容,

BEGIN;
CREATE TABLE "lancer_testmodel" (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
)
;

COMMIT;

其他两个模型的 SQL 代码发生了什么变化?它是否只为显式继承 models.Model 的模型创建表?

附加信息,

  1. 我在末尾添加了AUTH_USER_MODEL = 'lancer.CustomUser' 根据 Django 文档的 settings.py 文件
  2. 我在 settings.py 中注释掉了所有其他已安装的应用程序。我知道 contrib.auth 使用了很多,但是因为我正在使用 一个新的自定义用户模型,我只是将其他所有内容都注释掉了。

这就是现在的样子,

INSTALLED_APPS = (
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.sites',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'lancer',
)

【问题讨论】:

  • 变量AUTH_USER_MODEL?已添加到您的设置中
  • @VictorCastilloTorres 是的。我在 settings.py 文件的末尾添加了 AUTH_USER_MODEL = 'lancer.CustomUser'。
  • 我认为你的 INSTALLED_APPS 中有 myapp_where_my_model_is 之类的东西
  • @VictorCastilloTorres 我最后有它,“lancer”,这是我的应用程序的名称。我还需要包含除此之外的任何内容吗?我的 testModel 似乎工作得很好,只是自定义用户模型没有创建表。
  • 我找到了解决方案,看看我的答案

标签: django model syncdb


【解决方案1】:

PermissionsMixin 取决于

'django.contrib.auth',
'django.contrib.contenttypes',

如果您只评论django.contrib.auth 而取消评论django.contrib.contenttypes, 你会有这个错误

CommandError:一个或多个模型未验证: users.myuser:'groups' 与模型<class 'django.contrib.auth.models.Group'> 具有 m2m 关系,该模型要么尚未安装,要么是抽象的。 users.myuser: 'user_permissions' 与模型 <class 'django.contrib.auth.models.Permission'> 有 m2m 关系,该模型要么尚未安装,要么是抽象的。

如果您取消评论 django.contrib.auth 并评论 django.contrib.contenttypes

你会遇到这个错误

CommandError:一个或多个模型未验证: auth.permission: 'content_type' 与模型 class 'django.contrib.contenttypes.models.ContentType'> 有关系,该模型要么未安装,要么是抽象的。

如果你取消注释这两个,sqlall 必须生成你的表:D

【讨论】:

  • 谢谢。实际上,我发现我的代码有 1 个更严重的问题(我应该完整发布,但它太长了......)。由于我从 Django 现有的 contrib.auth.Abs​​tractUser 中复制了大部分代码,因此我还复制了这段代码:class Meta: verbose_name = _('user') verbose_name_plural = _('users') abstract = True,这显然告诉 Django 这不是真正的模型或其他东西,因为它有这个“abstract=True “ 事物。删除它以及您建议的更改后,它起作用了!谢谢!!
  • 是的,抽象意味着`该模型将不会用于创建任何数据库表。`正如文档所说(docs.djangoproject.com/en/dev/topics/db/models/…
  • 我花了这么长时间才弄明白!我试图将 Stormpath 添加到我的应用程序中,但他们的文档中没有提到它。谢谢!
猜你喜欢
  • 2016-06-20
  • 2018-01-28
  • 1970-01-01
  • 2019-10-17
  • 2017-03-03
  • 2018-06-11
  • 2021-12-19
  • 2013-12-23
  • 1970-01-01
相关资源
最近更新 更多