如何在Django 1.5中使用'User'作为外键

sup*_*rio 50 python django django-users

我制作了一个自定义配置文件模型,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时manage.py syncdb,我得到:

myapp.userprofile:'user'与模型User有关系,它没有安装或者是抽象的.

我也尝试过:

from django.contrib.auth.models import BaseUserManager, AbstractUser
Run Code Online (Sandbox Code Playgroud)

但它给出了同样的错误.哪里我错了,如何解决这个问题?

Ant*_*off 61

正是在Django 1.5 中引入AUTH_USER_MODEL设置,允许使用具有auth系统的自定义用户模型.

如果您正在编写一个旨在与Django 1.5到1.10及更高版本的项目一起使用的应用程序,这是引用用户模型的正确方法(现在可以与之不同django.contrib.auth.models.User):

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)
  • 有关详细信息,请参阅文档.

如果您正在编写一个支持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())
Run Code Online (Sandbox Code Playgroud)


Cap*_*awk 56

改变这个:

user = models.ForeignKey('User', unique=True)
Run Code Online (Sandbox Code Playgroud)

对此:

user = models.ForeignKey(User, unique=True)
Run Code Online (Sandbox Code Playgroud)

  • 如果我们使用`OneToOneField`而不是`ForeignKey`和`unique`约束,那不是更清楚吗? (7认同)
  • 注意:如果你这样做,稍后尝试扩展你的用户模型创建自定义用户模型,你需要将其更改为settings.AUTH_USER_MODEL,因为Anton Strogonoff在他的文章中说 - 更正确的IMO - 回答 (4认同)
  • 如果您的关系是一对一的话,请使用`OneToOneField`,并添加`primary_key = True` (2认同)