在项目中间创建自定义用户模型,而不删除迁移或数据库



在我的模型中,我创建了UserManager和User,并将其添加到我的设置中:

AUTH_USER_MODEL = "myapp.User"

但当我迁移时,它引发了无法解决的错误相关模型。我在网上搜索了一下,但找不到解决我问题的答案<--->由于这个问题在互联网上没有好的答案,而且在这里的一个朋友的帮助下,我仍然没有找到解决方案(尽管如此,我不知道我得了负分(,我想我需要询问更多细节我在我的模型中定义了这些类。py:

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

class UserManager(BaseUserManager):
def _create_user(self, email, password, **extra_fields):
"""
Creates and saves a User with the given email,and password.
"""
if not email:
raise ValueError('The given email must be set')
try:
with transaction.atomic():
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
except:
raise
def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self._create_user(email, password=password, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
"""
An abstract base class implementing a fully featured User model with
admin-compliant permissions.
"""
email = models.EmailField(max_length=40, unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
def save(self, *args, **kwargs):
super(User, self).save(*args, **kwargs)
return self

我在我的设置中添加了这个:

AUTH_USER_MODEL = "myapp.User"

我运行makemigrations,它没有错误,但当我尝试运行migration时,我给出了以下错误:

in resolve_related_fields
raise ValueError('Related model %r cannot be resolved' % self.remote_field.model)
ValueError: Related model 'myapp.User' cannot be resolved

我认为这个问题是因为您一直在使用django的用户模型,突然之间您将USER_AUTH_MODEL更改为自定义User模型。然后您正在运行迁移,它会抛出错误。

事实上,没有很好的解决方案。请参阅相关文档。

如文档中所述,for可以按照票证25313中的说明迁移用户:

  1. 创建一个与auth相同的自定义用户模型。User,将其称为User(多对多的表保持相同的名称(,并设置db_table='auth_User'(因此它使用相同的表(
  2. 删除所有迁移(migrations文件夹中的__init__.py文件除外(
  3. 重新创建一组新的迁移(python manage.py makemigrations(
  4. 备份数据库
  5. 截断django_migrations表
  6. 伪造应用新的迁移集(python manage.py migrate --fake(
  7. 取消设置db_table,对自定义模型进行其他更改,生成迁移并应用它们

按照以下说明

  1. 创建数据库备份:pg_dump-U用户名称-d数据库名称--仅限数据>文件名称.sql
  2. 转到.sql文件路径并使用run命令重命名:sed-i的/auth_user/custom_user/g'文件名.sql
  3. 转到sql终端运行命令:=#select"删除表(如果存在("||表名||'"级联;'从…起pg_tables,其中schemaname='public';=#\gexec
  4. 查找-路径">/migrations/.py"-not-name">init.py"-删除
  5. 查找-路径">/migrations/.pyc"-删除
  6. python manage.py makemigrations
  7. python manage.py migrate
  8. 使用以下命令将.sql文件加载到数据库:psql-U用户名称-d数据库名称-f文件名称.sql

最新更新