Django中的自定义用户模型:`没有这样的表:auth_user`

时间:2016-10-20 13:25:28

标签: python django django-authentication django-registration

根据我之前question的答案,我编辑了django-registration模块,并进行了以下修改:

myapp/models.py中的

from django.contrib.auth.models import UserManager
from django.contrib.auth.models import AbstractUser

class AccountManager(UserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Users must have a valid email address.')
        if not kwargs.get('username'):
            raise ValueError('Users must have a valid username.')

        account = self.model(
            email=self.normalize_email(email), 
            username=kwargs.get('username'), 
            #year_of_birth = kwargs.get('year_of_birth'),
            #MODEL = kwargs.get('MODEL_NAME'),
        )
        account.set_password(password)
        account.save()

        return account

    def create_superuser(self, email, password, **kwargs):
        account = self.create_user(email, password, **kwargs)
        account.is_staff = True
        account.is_superuser = True
        account.save()

        return account

class Account(AbstractUser):
    #email = models.EmailField(unique=True)
    points = models.FloatField(default = 100.0)
    #ADD YOUR MODELS HERE

    objects = AccountManager()

    def __str__(self):
        return "Account: "+self.username

myproject/settings.py

AUTH_USER_MODEL = 'myapp.Account'

现在应用程序的其余部分工作(即引用Account,它也有User模型的基本字段。但是,django-registration模块本身现在不起作用。当我发送新的注册表(包含用户名,电子邮件和密码)时,我收到错误:

OperationalError at /accounts/register/
no such table: auth_user

我尝试了makemigrationsmigrate(以及--fake--fake-initial个参数)的很多组合但是(我猜)auth表是没有使用新设置初始化。

如何解决此问题,以便我可以继续使用新的Account模式进行注册,同时不会损害默认的auth模块的User模型?

感谢您的帮助,

修改

当我试图在shell中看到用户时,我收到了这个错误,这让事情变得更加清晰:

>>> from django.contrib.auth.models import User
>>> users = User.objects.all()
AttributeError: Manager isn't available; User has been swapped for 'myapp.Account'

所以我的新模型Account似乎覆盖了默认的User模型。如果是这样,为什么注册模块会查找auth_user表? settings.py中的修改是否旨在解决此问题?

1 个答案:

答案 0 :(得分:1)

如果已应用该应用的迁移,则无法为引用该应用的任何应用交换用户模型。尝试通过创建新数据库,在其上重新应用迁移,然后从旧数据库移动数据来重新创建数据库