2015-07-17 2 views
0

мне нужно импортировать заказную модель пользователя в приложение третьей стороны, проблема по умолчанию модель пользователя этого приложения импортировать Джанго, так:Импорт класс AUTH_USER_MODEL заказной модели пользователя в 3 партию приложения

from django.contrib.auth.models import User 

У меня есть пользовательский Пользователь, я мог бы это сделать:

from myapp.models import User 

, но я хочу общее решение.

я попытался:

1:

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

выход:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

2:

from django.conf import settings 
from django.db.models import get_model 

app_label, model_name = settings.AUTH_USER_MODEL.split('.') 
User = get_model(app_label, model_name) 

выход:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

3:

from django.conf import settings 
User = settings.AUTH_USER_MODEL 

выход:

TypeError 

isinstance() arg 2 must be a class, type, or tuple of classes and types 

нужно специально выполнить этот код

if isinstance(author, User) and author.is_authenticated(): 
    kwargs['author'] = u"%s <%s>" % (author.get_full_name() or author.username, author.email) 
elif isinstance(author, six.string_types): 
    kwargs['author'] = author 

Как я могу это сделать? Благодаря

ответ

0

Я думаю, что ваш «подход 1» является правильной, но проблема в том, что вы не можете запустить get_user_model() до после загрузки всех. Например, вы можете изменить основной код на:

if isinstance(author, get_user_model()) and author.is_authenticated(): 
    kwargs['author'] = u"%s <%s>" % (author.get_full_name() or author.username, author.email) 
elif isinstance(author, six.string_types): 
    kwargs['author'] = author 

Это будет медленным, поскольку он работает get_user_model() каждый раз, так что вы должны найти место для хранения пользовательской модели, так что вы только запустить get_user_model() в первый раз код вызывается. Например, если этот код находится в методе объекта, вы можете поставить self._user_model = get_user_model() в конструктор.

Другим вариантом было бы проверить, если автор является string_typesпервый, а затем

try: 
    kwargs['author'] = u"%s <%s>" % (author.get_full_name() or author.username, author.email) 
except TypeError: 
    # do whatever you already do, if the client code passes the wrong kind of object. 
    pass