2016-12-05 4 views
0

Я нашел много контента в ExRegistryNotReady Exception, но ни один из них не выглядит сдерживающим. Мне просто нужны мои 2 цента информации по этой теме.Django Exception: AppRegistryNotReady («Модели еще не загружены».)

Мой проект django работал нормально. Я создал новое приложение и создал следующую модель. Нет взгляда, никаких URL-адресов нет. Просто модель.

from __future__ import unicode_literals 

from django.db import models 

# Create your models here. 

from django.conf import settings 
from django.core.exceptions import ValidationError 
from django.contrib.auth import get_user_model 
User = get_user_model() 

class File(models.Model): 
    path = models.TextField() #The path does not include MEDIA_ROOT, obviously 
    filename = models.CharField(max_length=500) 
    # file = models.FileField(upload_to=upload_to) 
    file = models.FileField(upload_to=path+filename) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, models.PROTECT) #Protects User from being deleted when there are files left 

    def clean(self): 
     #Check if path has a trailing '/' 
     if self.path[-1]!='/': 
      self.path = self.path+"/" 
     if self.filename[0]=='/': 
      self.filename = self.filename[1:] 

     #Get the full path 
     username = self.user.__dict__[User.USERNAME_FIELD] #Need to do this the roundabout way to make sure that this works with CUSTOM USER MODELS. Else, we could have simply went for self.user.username 
     self.path = "tau/"+username+"/"+self.path 

    def save(self, *args, **kwargs): 
     self.full_clean() 
     return super(File, self).save(*args, **kwargs) 

    def __str__(self): 
     if path[-1]=='/': 
      text = "\n"+str(path)+str(filename) 
     else: 
      text = "\n"+str(path)+"/"+str(filename) 
     return text 

Затем я попытался адаптироваться к модели. И закончилась следующая ошибка.

(test) ~/Workspace/WebDevelopment/Django/test/stud$python manage.py makemigrations 
Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 341, in execute 
    django.setup() 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/__init__.py", line 27, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/apps/config.py", line 199, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/stud/tau/models.py", line 10, in <module> 
    User = get_user_model() 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 163, in get_user_model 
    return django_apps.get_model(settings.AUTH_USER_MODEL) 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/apps/registry.py", line 192, in get_model 
    self.check_models_ready() 
    File "/home/raghuram/Workspace/WebDevelopment/Django/test/local/lib/python2.7/site-packages/django/apps/registry.py", line 131, in check_models_ready 
    raise AppRegistryNotReady("Models aren't loaded yet.") 
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

Просто ради завершения теста, я изменил свою модель на это,

class File(models.Model): 
     file = models.FileField() 

И остановил исключение. Поэтому я предполагаю, что Исключение было поднято этим.

from django.contrib.auth import get_user_model 
User = get_user_model() 

Но мне нужно использовать это, поскольку Im работает с пользовательской моделью пользователя. Любая идея о том, как я могу это сделать?

+0

Вы пробовали 'от django.contrib.auth.models импортируют User'? –

ответ

0

AbstractBaseUser предлагает метод get_username(), который вы можете использовать вместо этого. Он практически делает то же самое, что и вы: return getattr(self, self.USERNAME_FIELD).

class File(models.Model): 
    ... 
    def clean(self): 
     #Check if path has a trailing '/' 
     if self.path[-1]!='/': 
      self.path = self.path+"/" 
     if self.filename[0]=='/': 
      self.filename = self.filename[1:] 

     #Get the full path 
     username = self.user.get_username() 
     self.path = "tau/"+username+"/"+self.path 

Причина ваш оригинальный метод не удалось, потому что get_user_model() выполняется, когда модуль импортируется первый, в это время в реестре приложение не полностью инициализирован. Если вам нужно использовать get_user_model() в models.py файл, вы должны вызвать его внутри функции или метода, а не на уровне модуля:

class File(models.Model): 
    ... 
    def clean(self): 
     User = get_user_model() 
+0

Да, я закончил тем, что положил get_user_model() внутри функции. Большое спасибо. –

Смежные вопросы