2013-10-17 86 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

相关问题