【问题标题】:AppRegistryNotReady error with django 1.7 and custom Userdjango 1.7 和自定义用户的 AppRegistryNotReady 错误
【发布时间】:2015-05-01 20:24:30
【问题描述】:

我正在创建一个自定义 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.py 中)

AUTH_USER_MODEL = 'myapp.MyCustomUserModel'

当登录 shell 时尝试像这样使用我的新用户类型

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

我得到了上面的错误。 Django 1.7 有什么问题吗

P.S:我使用 makemigrations 和 migrate 来制作模型,我在 virtualenv 后面。

【问题讨论】:

  • 如何启动shell?通过manage.py?
  • @Apostolos 你做了吗,import djangodjango.setup()
  • 文档说:另一个常见的罪魁祸首是 django.contrib.auth.get_user_model()。使用 AUTH_USER_MODEL 设置在导入时引用用户模型。
  • 请检查this中的这些答案是否对您有帮助。
  • 我应该在哪里导入 django.setup。我正在运行 django shell,它会自动导入所有这些

标签: python django django-custom-user


【解决方案1】:

从 django 1.7 开始,你不能在你的 models.py 文件中使用 get_user_model ,否则你会遇到这个问题。详情/原因可见referencing the user model

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

from django.conf import settings

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

当您解决问题时,它会修复您的应用程序以及您的外壳。

【讨论】:

  • 我在所有对自定义用户模型的引用中都使用了 settings.AUTH_USER_MODEL。我的问题是它可以在我的 linux 终端上运行,但不能在我的 pycharm shell 上运行。
【解决方案2】:

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

在您的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 下工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多