扩展我的Django用户模型的问题

时间:2017-03-31 02:49:46

标签: python django

我有一个简单的django应用程序,我正在尝试设置自定义Django用户模型,以便我可以让用户使用他们的电子邮件字段登录。我认为我设置的一切都很好,一切都相当简单,但是当我尝试实际运行迁移时,我得到了这个错误:

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency accounts.0001_initial

看起来很奇怪?

我无法理解为什么理解困难。

继续实施用户模型

from __future__ import unicode_literals

from django.db import models
from django.core.mail import send_mail
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.base_user import AbstractBaseUser
from django.utils.translation import ugettext_lazy as _

from .managers import UserManager


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    display_name = models.CharField(_('display name'), max_length=30, blank=True)
    bio = models.TextField(blank=True)
    date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
    is_active = models.BooleanField(_('active'), default=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)

objects = UserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

class Meta:
    verbose_name = _('user')
    verbose_name_plural = _('users')

def get_full_name(self):
    '''
    Returns the first_name plus the last_name, with a space in between.
    '''
    full_name = '%s %s' % (self.first_name, self.last_name)
    return full_name.strip()

def get_short_name(self):
    '''
    Returns the short name for the user.
    '''
    return self.first_name

def email_user(self, subject, message, from_email=None, **kwargs):
    '''
    Sends an email to this User.
    '''
    send_mail(subject, message, from_email, [self.email], **kwargs)

3 个答案:

答案 0 :(得分:1)

基本上,您已经创建了一些用户帐户或者至少已经创建了超级用户帐户。由于您在假设您已经至少进行过一次迁移后更改了用户模型,因此Django与旧用户模型与新用户模型发生冲突。

解决方案是删除管理员中的所有帐户,包括超级用户。然后删除迁移文件夹中的迁移文件。而且我认为删除你的sqlite数据文件。再次运行迁移,它应该可以工作。

您应该在迁移之前创建自定义用户模型。

答案 1 :(得分:1)

“启动项目时使用自定义用户模型”

如果您要开始一个新项目,强烈建议您设置自定义用户模型,即使默认的用户模型足够您。此模型的行为与默认用户模型相同,但如果需要,您将来可以对其进行自定义。“reference-> django docs

然后你必须指定你正在使用新用户模型的setting.py(在你第一次迁移之前再次这样做。)

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

# in settings.py

AUTH_USER_MODEL = 'myapp.MyUser'

我强烈建议您查看上面的链接。

现在要解决您的问题,您可以在迁移目录下的应用路径中删除迁移并重置数据库并按照上述说明操作。

在django中更改用户模型项目中心并且需要手动编辑您的模式,因为您的项目仅用于教育目的,只需将其重置

答案 2 :(得分:0)

一种解决方案是截断 django_migrations 表。

要做到这一点,您必须:

<块引用>

使用 mysql -u root -p

登录到您的数据库(如果您使用 Mysql)

use your_db_name;

SET FOREIGN_KEY_CHECKS=0; 防止关系错误

DELETE FROM django_migrations; 截断 django_migrations

SET FOREIGN_KEY_CHECKS=1;

然后你就可以运行你的迁移了!

另一种解决方案是在迁移之前运行这些命令以避免迁移错误:

python manage.py migrate admin zero --fake
python manage.py migrate auth zero --fake
python manage.py migrate contenttypes zero --fake
python manage.py migrate sessions zero --fake
<块引用>

警告:

此解决方案可能会给您留下一个数据库架构 与应用的迁移不一致,因此仅在以下情况下执行此操作 你知道你在做什么。感谢@AKX

您也可以使用 this 解决方案!