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

stu*_*101 10 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'.
Run Code Online (Sandbox Code Playgroud)

Settings.py已安装的应用程序,Auth后端和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"
Run Code Online (Sandbox Code Playgroud)

Admin.py:

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

# Register your models here.
admin.site.register(User)
Run Code Online (Sandbox Code Playgroud)

下面是我的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"
Run Code Online (Sandbox Code Playgroud)

Rya*_*der 9

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

  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. 从转储还原数据库


AKX*_*AKX 6

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

如果您要从 auth.User 迁移到 custom.User,则在不丢失数据的情况下解决此问题的一种稍微笨拙的方法是添加一个“虚拟”(单独的数据库和状态)最小模型(即,仅 ID 字段,以允许对于外键)根据初始迁移中的新用户模型,因此未来的迁移有此参考:

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
Run Code Online (Sandbox Code Playgroud)

  • 伙计,你是天才!找到的唯一解决方案是“删除所有迁移并享受”。 (4认同)
  • 请注意,这仅在放入“0001_initial.py”时才有效。顺便说一句,修复得很好 (2认同)

dak*_*aka 5

这个:

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

@AKX在回答中提到的... 给了我一个可行的想法。

我做了以下工作:

  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

  • 我知道这是一个旧答案,但这对我的团队非常有帮助,我想说谢谢。这应该是公认的答案。 (4认同)

stu*_*101 -1

显然代码没有任何问题,我只需删除所有用户表并运行 makemigration 和 migrate 即可。

  • “我只需删除所有用户表”是一个无意义的陈述。“Just”意味着做一些非侵入性的、琐碎的事情。而你却建议采取最具破坏性的行动。 (5认同)
  • 这样做几乎从来都不是一个好主意。如果您在本地数据库上执行此操作,那么您的开发/产品服务器上的事情很可能最终会变得混乱。 (3认同)