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)
对我来说,帮助进行了两次迁移
AUTH_USER_MODEL = 'accounts.User')AUTH_USER_MODEL到settings.py与新表中的其他的连接但是,如果您要从测试中的第一个迁移或从头开始创建数据库的另一个迁移应用迁移,则它适用于开发/生产数据库,您应该“压缩迁移”,对我而言,这是下一步:
sqldump)django_migrations)manage.py makemigrationsmanage.py migratedjango_migrations转储中的表(也许还有其他一些django_*表)这是由于您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)
这个:
这是由您的设置引起的。AUTH_USER_MODEL已更改为在计算迁移时不存在的模型。
我做了以下工作:
User模型放置到位。设置AUTH_USER_MODEL在settings.py与更新的任何使用django.contrib.auth.models.User与您的自定义用户模型。python manage.py makemigrationspython manage.py migratestu*_*101 -1
显然代码没有任何问题,我只需删除所有用户表并运行 makemigration 和 migrate 即可。