Django 1.7和自定义用户出现AppRegistryNotReady错误

4

我正在创建一个自定义的Django用户,但在尝试使用它时出现以下错误。我收到的错误信息如下:

AppRegistryNotReady: Models aren't loaded yet.

我的模型
class MyCustomUserManager(BaseUserManager):

    def create_user(self, username, email, password=None, **kwargs):
        if not username:
            raise ValueError("Username must be defined for users")

        if not kwargs.get('email'):
            raise ValueError("Users must have a valid email")

        user = self.model(username=username, email=self.normalize_email(email), **kwargs)

        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, username, email, password, **kwargs):
        user = self.create_user(username, email,  password, **kwargs)
        user.is_admin = True
        user.save()


class MyCustomUser(AbstractBaseUser):
    username = models.CharField(max_length=40, unique=True)
    email = models.EmailField(max_length=255, unique=True, verbose_name=_('Email Address'))
    date_of_birth = models.DateField(auto_now=False, blank=False, null=False, verbose_name=_("Ημ. Γεννήσεως"))
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    first_name = models.CharField(max_length=40, blank=False, null=False, verbose_name=_("Όνομα"))
    last_name = models.CharField(max_length=40, blank=False, null=False, verbose_name=_("Επίθετο"))
    friends = models.ManyToManyField('self', related_name="friends")

    objects = MyCustomUserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email',]

    def get_full_name(self):
        return "%s %s" % (self.first_name, self.last_name)    

    def __unicode__(self):
        return self.get_full_name()

    class Meta:
        verbose_name = _('Χρήστης')
        verbose_name_plural = _('Χρήστες')

我已经设置了settings文件,以包含我的新自定义用户模型。
(在settings.py文件中)
AUTH_USER_MODEL = 'myapp.MyCustomUserModel'

当尝试使用我的新用户类型登录shell时,请像这样操作:

from django.contrib.auth import get_user_model
user = get_user_model().objects.all()

我遇到了上述错误。这是Django 1.7的问题吗?
附言:我使用makemigrations和migrate制作了模型,并且在虚拟环境中。

你如何启动shell?通过manage.py吗? - GwynBleidD
@Apostolos,你执行了import djangodjango.setup()吗? - thefourtheye
文档中说:另一个常见的罪魁祸首是django.contrib.auth.get_user_model()。使用AUTH_USER_MODEL设置在导入时引用用户模型。 - Gabriel Amram
请检查此链接中的任何答案是否对您有帮助:https://dev59.com/aV8e5IYBdhLWcg3wo7mE。 - thefourtheye
我应该在哪里导入django.setup。我正在运行Django shell,它会自动导入所有这些。 - Apostolos
显示剩余2条评论
2个回答

2

从Django 1.7开始,您不能在models.py文件中使用get_user_model,否则会遇到此问题。可以在引用用户模型中看到详细信息/原因。

为解决此问题,在您的models.py文件中,您需要从设置中导入名称来引用自定义用户模型,而不是使用get_user_model。

from django.conf import settings

class MyModel(models.Model):
    ...
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

当您解决问题时,它将修复您的应用程序以及您的shell。

我在所有对自定义用户模型的引用中使用settings.AUTH_USER_MODEL。我的问题是它可以在Linux终端中工作,但无法在Pycharm shell中工作。 - Apostolos

0

这篇文章已经存在一段时间了,今天我在使用Django shell时遇到了同样的问题,并想通过编写自定义get_user_model()并使用import_module来分享一个快速解决方法。

在你的models.py中的一个模块下:

from django.conf import settings
from importlib import import_module

USER_MODEL = settings.AUTH_USER_MODEL.rsplit('.', 1)

def get_user_model():
    models = getattr(import_module(USER_MODEL[0]), 'models')
    return getattr(models, USER_MODEL[1])

在我的本地机器(Mac)上,这在Django shell下可以工作,我希望在PyCharm shell下也可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接