目前我正在使用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"
答案 0 :(得分:4)
对我来说,帮助进行了两次迁移
AUTH_USER_MODEL = 'accounts.User'
)AUTH_USER_MODEL
添加到settings.py
并使用新表添加其他连接但是它适用于开发/生产数据库,如果您要从测试中的第一个迁移开始应用迁移,或者从头开始创建数据库时应用另一个迁移,则应该“压缩迁移”,对我而言,这是下一步:
sqldump
)django_migrations
)manage.py makemigrations
manage.py migrate
django_migrations
(也许还有其他django_*
表)答案 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)
此:
{p> ... @AKX在their answer中提到的...给了我一个可行的想法。这是由您的设置引起的。AUTH_USER_MODEL已更改为计算迁移时不存在的模型。
我做了以下事情:
User
模型放置到位。在AUTH_USER_MODEL
中设置settings.py
,并使用您的自定义用户模型更新对django.contrib.auth.models.User
的使用。python manage.py makemigrations
python manage.py migrate
答案 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_admin
和auth
应用相关的所有迁移: DELETE FROM django_migrations WHERE app='admin' or app='auth';
./manage.py migrate
答案 5 :(得分:0)
或者,您也可以尝试:
python manage.py migrate <app_name>
。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会自己创建数据库,然后这将无法正常工作,因此请不要启动服务器。
完成了。
现在您可以启动服务器了。
然后取消注释所有其他模型并迁移它们。
答案 7 :(得分:0)
user = models.OneToOneField(User,on_delete = models.PROTECT)
答案 8 :(得分:-1)
删除迁移目录下的所有迁移
现在您可以使用makemigrations进行迁移