懒惰参考:没有提供模型用户?

时间:2017-11-01 16:16:08

标签: django django-models

目前我正在使用Django 1.11和Python 3.6。我尝试使用通过LDAP进行身份验证的新应用程序创建自定义用户模型,但是我收到了以下错误消息。

    raise ValueError("\n".join(error.msg for error in errors))
ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'accounts.user', but app 'accounts' doesn't provide model 'user'.

Settings.py已安装的应用,验证后端和Auth_User型号:

INSTALLED_APPS = [
    'django_python3_ldap',
    'django_extensions',
    'django_filters',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',
]


AUTHENTICATION_BACKENDS = (
    'django_python3_ldap.auth.LDAPBackend',
    'django.contrib.auth.backends.ModelBackend',
)

AUTH_USER_MODEL = "accounts.User"

Admin.py:

from django.contrib import admin
from django.conf import settings
from .models import User

# Register your models here.
admin.site.register(User)

以下是我的models.py:

from __future__ import unicode_literals
from django.utils import timezone
from django.contrib.auth.models import (AbstractBaseUser,PermissionsMixin)
from django.db import models
from django.forms import ModelForm


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=25, unique=True)
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=140)
    date_joined = models.DateTimeField(default=timezone.now)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    facility = models.CharField(max_length=140)
    jobdescription = models.CharField(max_length=140)
    positiondescription = models.CharField(max_length=140)

    USERNAME_FIELD = "username"

9 个答案:

答案 0 :(得分:4)

对我来说,帮助进行了两次迁移

  1. 创建新表(没有新表和旧表之间的连接,并且没有AUTH_USER_MODEL = 'accounts.User'
  2. AUTH_USER_MODEL添加到settings.py并使用新表添加其他连接

但是它适用于开发/生产数据库,如果您要从测试中的第一个迁移开始应用迁移,或者从头开始创建数据库时应用另一个迁移,则应该“压缩迁移”,对我而言,这是下一步:

  1. 进行数据库转储(在我的情况下为sqldump
  2. 清理数据库(尤其是表django_migrations
  3. 删除项目中的所有迁移
  4. 运行manage.py makemigrations
  5. 添加迁移,以添加旧迁移中的所有数据插入
  6. 运行manage.py migrate
  7. 删除转储中的表django_migrations(也许还有其他django_*表)
  8. 从转储中恢复数据库

答案 1 :(得分:3)

这是由您的settings.AUTH_USER_MODEL更改为在计算迁移时不存在的模型引起的。

如果您要从auth.User迁移到custom.User ,则一种稍加修改的方式即可解决此问题,而不会丢失数据。是添加“虚拟”(数据库和状态分别)最小模型(也就是说,仅在ID字段中才允许使用外键),这是在最初的迁移过程中根据新的User模型进行的,因此以后的迁移将具有以下参考:

operations=[
    migrations.SeparateDatabaseAndState(
        state_operations=[
            migrations.CreateModel(
                name="User",
                fields=[
                    (
                        "id",
                        models.AutoField(
                            auto_created=True,
                            primary_key=True,
                            serialize=False,
                            verbose_name="ID",
                        ),
                    )
                ],
                options={"db_table": "auth_user"},
                managers=[("objects", UserManager())],
            )
        ]
    ),
    # ... other migrations

答案 2 :(得分:2)

此:

  

这是由您的设置引起的。AUTH_USER_MODEL已更改为计算迁移时不存在的模型。

{p> ... @AKXtheir answer中提到的...给了我一个可行的想法。

我做了以下事情:

  1. 尽一切努力将您的自定义User模型放置到位。在AUTH_USER_MODEL中设置settings.py,并使用您的自定义用户模型更新对django.contrib.auth.models.User的使用。
  2. 运行python manage.py makemigrations
  3. 撤消步骤1
  4. 运行python manage.py migrate
  5. 重做步骤1

答案 3 :(得分:0)

显然代码没有任何错误,我只需要删除所有用户表并运行makemigration并进行迁移。

答案 4 :(得分:0)

警告:它将破坏您当前的与用户模型相关的用户/组/身份验证表和条目

实际上在django 1.9+中就足够了:

  • 使用以下语句删除所有auth_*django_admin_log表:

DROP TABLE django_admin_log, auth_group, auth_group_permissions, auth_permission, auth_user, auth_user_groups, auth_user_user_permissions CASCADE;

  • 使用以下方法删除与django_adminauth应用相关的所有迁移:

DELETE FROM django_migrations WHERE app='admin' or app='auth';

  • 然后只需运行:

./manage.py migrate

答案 5 :(得分:0)

或者,您也可以尝试:

  1. 在包含自定义用户模型的应用上执行python manage.py migrate <app_name>
  2. 执行python manage.py migrate以应用其余的应用迁移。

之所以可行,是因为您先应用新的User模型的更改,然后再应用Django内置的其余auth模型。

不确定我是否正确解释了

答案 6 :(得分:0)

警告:它将删除整个数据库。如果您有一些重要数据,请通过dumpdata进行备份,然后通过loaddata进行恢复。 for more info check here (I am not sure about this).

在项目中间更改AUTH_USER_MODEL非常困难。 See the note in the docs。 第一次迁移Django表完成后感染,您将面临问题。

想法是:您需要在首次迁移(其中django)中将自定义用户模型及其条目包含在setting.py(AUTH_USER_MODEL = [自定义用户模型])中创建自己的表,例如Django项目的auth_group,dajango_migrations等...)。

警告:如果您已启动服务器,则Django会自己创建数据库,然后这将无法正常工作,因此请不要启动服务器。

  • 删除dbsqlite3数据库文件,删除除初始化文件外的所有迁移文件及其二进制文件(在app / migration / pycache 中),并注释掉所有模型及其依赖项(例如,您曾经使用过模型,然后也对其进行评论。)
  • 现在取消注释仅自定义用户模型
  • 在setting.py中添加AUTH_USER_MODEL(AUTH_USER_MODEL = [自定义用户模型])
  • ,然后运行makemigrations并进行迁移。 (这将创建您的所有Django表和您的自定义用户模型。)

完成了。

现在您可以启动服务器了。

然后取消注释所有其他模型并迁移它们。

答案 7 :(得分:0)

user = models.OneToOneField(User,on_delete = models.PROTECT)

答案 8 :(得分:-1)

删除迁移目录下的所有迁移

现在您可以使用makemigrations进行迁移