2013-07-04 169 views
6

我正在開發一個Django 1.5項目,並且我有一個自定義用戶模型(我們稱之爲CustomUser)。另一個應用程序(SomeApp)需要引用此自定義用戶模型。對於ForeignKey的和這樣的目的,Django文檔說,使用Django 1.5:訪問models.py中的自定義用戶模型字段

User = settings.AUTH_USER_MODEL 

然而,在SomeApp.models某些功能需要訪問什麼將以前被稱爲User.objects。但用戶現在是一個字符串,而不是一個類,所以User.objects失敗。另一種方法是

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

在其他模塊,這些模塊的工作原理,但是當我使用這SomeApp的models.py,Django的引發錯誤:

ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)

任何想法?

編輯1 - 回溯:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "...\django-badger\badger\__init__.py", line 7, in <module> 
    from badger.models import Badge, Award, Progress 
    File "...\django-badger\badger\models.py", line 26, in <module> 
    User = get_user_model() 
    File "...\lib\site-packages\django\contrib\auth\__init__.py", line 127, in get_user_model 
    raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL) 
ImproperlyConfigured: AUTH_USER_MODEL refers to model 'MyApp.AuthUser' that has not been installed 

EDIT 2 - INSTALLED_APPS設置:

INSTALLED_APPS = (
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django.contrib.admindocs', 
'south', 
'MyApp', # this is where my user model is defined 
'SomeApp', # I try to use get_user_model() in this app's models.py; doesn't work. 
'social_auth', 
) 
+0

你可以發佈完整的追溯? – jpic

+0

你是如何在你的設置中定義'AUTH_USER_MODEL'的?用戶是哪個應用程序,它的類名是什麼? – matino

+0

@matino - 是的,它是在設置中定義的。 get_user_model()在除models.py之外的所有其他文件中工作正常。我的自定義用戶模型AuthUser在MyApp中定義(在本例中) – askvictor

回答

0

你必須設置,

AUTH_USER_MODEL = "yourapp.CustomUser"

在settings.py

。然後get_user_model()將工作。有一個乾淨的documentation available

+0

它已經是。 get_user_model()可用於除models.py之外的其他文件。 – askvictor

+0

檢查您的'INSTALLED_APPS'的順序。包含'CustomUser'的應用程序應該比其他應用程序最頂層。詳細的解釋在這裏,https://code.djangoproject.com/ticket/19218 – Babu

0

我開始思考一個解決辦法可能是爲了 - 任何評論在SomeApp/models.py以下 :

from django.contrib.auth.models import User as UserModel 
try: 
    from django.contrib.auth import get_user_model 
except ImportError: #django <= 1.4 doesn't have get_user_model so define our own 
    def get_user_model(): 
     return UserModel 
User = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') 
... 
def SomeModel(models.Model): 
    user = models.ForeignKey(User) # using the name of the model 
    def some_method(self, email): 
     qs = get_user_model().objects.filter(email=email) # using function call to get model class 
+0

嘿@askvictor,你是如何解決這個問題的?我遇到了同樣的問題,但是在運行遷移時以及在我的應用程序之後安裝的程序包。 – tzenderman

+0

@tzenderman - 通過暫停項目來解決它: - /對於遷移,我有一些相關的問題,我通過創建中間遷移以及needed_by或depends_on:http:// stackoverflow來解決。com/questions/17711515/django-south-circular-dependency – askvictor

3

確保您的自定義用戶模型不是抽象的。

1

我覺得這個來自SomeApp的導入會導致循環導入。這就是爲什麼在docs中有一個聲明可以像調用設置屬性一樣使用ForeignKey。

至於我,當我使用django-filer應用程序時遇到了這個問題。在github上有一個commit以防止使用get_user_model()進行導入。您可以使用代碼來解決問題。

這個問題非常棘手,因爲當你嘗試從shell調用get_user_model()時它會起作用。

8

我剛纔有同樣的問題,這裏是我的2美分/解決方案。

如果你想使用自定義的用戶模型在models.py您將使用外鍵settings.AUTH_USER_MODEL和模型方法,你必須使用get_user_model(),但它必須是的方法。由於循環導入,它不會在外面工作。

from django.conf import settings 
from django.contrib.auth import get_user_model 

class Event(models.Model): 

    recipient = models.ForeignKey(settings.AUTH_USER_MODEL) 
    ... 

    def get_something(self): 

     User = get_user_model() 
     u = User.objects.get(id=...) 
     ... 
+2

這是確定的答案。謝謝氟利昂! –

10

很簡單,我想。遞歸包含等問題我有很多問題...... 好,最簡單的事情,當你添加一個ForeignKey,是把它寫像這樣:

user = models.ForeignKey(settings.AUTH_USER_MODEL, null=False, on_delete=models.CASCADE, verbose_name=_(u"User")) 

如果你使用get_user_model,像你這樣不使用它。在模塊的頂部調用

User = get_user_model() 

將嘗試導入User模型,這可能確實,沒有被「安裝」。 相反,你有幾種選擇:

  • 在您的模塊的頂部,寫

    用戶= get_user_model#然後,你將不得不使用用戶(),而不是用戶

  • get_user_model()無處不在,它很有用。總是在方法或函數中,決不能直接在模型模塊體中。

+0

這對我有用。我正在導入文件頂部的get_user_model()具有完整意義。謝謝 – Howie

+0

你如何處理聲明代碼中的這個問題?例如,UserSerializer類具有指定模型的Meta類。您不能將用戶模型的定義推遲到執行時間,因爲整個定義在導入時會被解析。 – dangonfast

0

您是否在運行South 0.8.3?

確保您南部至少0.8.4

運行GitHub的issue South推出Notes

相關問題