2013-10-17 28 views
42

我已經做了自定義配置的模型,看起來像這樣:如何在Django中使用「用戶」作爲外鍵1.5

from django.db import models 
from django.contrib.auth.models import User 

class UserProfile(models.Model): 
    user = models.ForeignKey('User', unique=True) 
    name = models.CharField(max_length=30) 
    occupation = models.CharField(max_length=50) 
    city = models.CharField(max_length=30) 
    province = models.CharField(max_length=50) 
    sex = models.CharField(max_length=1) 

但是當我運行manage.py syncdb,我得到:

MYAPP .userprofile:'user'與模型User有關係,其中 未安裝或抽象。

我也試過:

from django.contrib.auth.models import BaseUserManager, AbstractUser 

但它給了同樣的錯誤。我錯在哪裏以及如何解決這個問題?

+0

是「django.contrib中.auth「in settings.py中的'INSTALLED_APPS'中? – karthikr

+0

這似乎工作:'user = models.OneToOneField(User,primary_key = True)'。但不知道有什麼區別。 – supermario

+0

區別在於,對於OneToOneField,用戶只能有一個配置文件(這可能是您想要的)。 – Mark

回答

48

更改此:

user = models.ForeignKey('User', unique=True) 

這樣:

user = models.ForeignKey(User, unique=True) 
+7

如果我們使用'OneToOneField'而不是''ForeignKey'''''''''''''''''' – vabhdman

+4

要注意:如果你這樣做,然後嘗試擴展你的用戶模型,創建一個自定義的用戶模型,你需要將它改爲settings.AUTH_USER_MODEL,正如Anton Strogonoff在他的 - 更正確的IMO中所說的 - 回答 – tato

+2

如果使用'OneToOneField' if你的關係是一對一的,並添加'primary_key = True' – erajuan

57

恰好在Django 1.5 AUTH_USER_MODEL設置was introduced,允許使用具有身份驗證系統的自定義用戶模型。

如果你正在寫的預期與項目上的Django 1.5至1.10的工作,後來,這是引用用戶模型(現在它可不同於django.contrib.auth.models.User)的正確方式的應用:

class UserProfile(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
  • 查看docs瞭解更多詳情。

如果你正在編寫一個可重複使用的應用程序支持的Django 1.4,那麼你或許應該確定通過檢查Django的版本使用什麼參考,也許是這樣的:

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


def get_user_model_fk_ref(): 
    if django.VERSION[:2] >= (1, 5): 
     return settings.AUTH_USER_MODEL 
    else: 
     return 'auth.User' 


class UserProfile(models.Model): 
    user = models.ForeignKey(get_user_model_fk_ref()) 
+0

我改變了代碼,注意把版本號作爲一個十進制數。畢竟,1.10版本被認爲高於1.5,如果我們將它們作爲十進制數字處理,則不是這樣。 – Flimm

+0

@Flimm對我來說很好,不喜歡那種帶小數點的跳舞。元組比較勝過它(可能稍微不那麼直觀,但它的工作原理!) – Tony

相關問題