【问题标题】:How to use 'User' as foreign key in Django 1.5如何在 Django 1.5 中使用“用户”作为外键
【发布时间】:2013-10-26 08:25:21
【问题描述】:

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

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

但它给出了同样的错误。我错在哪里以及如何解决这个问题?

【问题讨论】:

  • 你的settings.py中INSTALLED_APPS中的“django.contrib.auth”是否存在?
  • 这个似乎有效:'user = models.OneToOneField(User, primary_key=True)'。但是不确定有什么区别。
  • 不同之处在于,对于 OneToOneField,用户只能拥有一个配置文件(这可能是您想要的)。

标签: python django django-users


【解决方案1】:

正是在 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())

【讨论】:

  • 我更改了代码以注意将版本号视为十进制数。毕竟 1.10 版本被认为高于 1.5 版本,如果我们将它们视为十进制数字,这是不正确的。
  • @Flimm 对我来说看起来不错,反正不喜欢小数的那种舞蹈。元组比较胜过它(可能不太直观,但它有效!)
【解决方案2】:

改变这个:

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

到这里:

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

【讨论】:

  • 如果我们使用OneToOneField 而不是ForeignKeyunique 约束,会不会更清楚。
  • 当心:如果您这样做并稍后尝试扩展您的用户模型创建自定义用户模型,您将需要将其更改为 settings.AUTH_USER_MODEL 正如 Anton Strogonoff 在他的 - 更正确的 IMO -回答
  • 如果您的关系是一对一的,请使用OneToOneField,并添加primary_key=True
  • 对于较新版本的 Django,ForeignKey 要求您指定 on_delete=models.CASCADE 或另一个 on_delete option
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 2014-05-09
  • 2018-09-05
  • 2014-09-07
  • 2013-05-31
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多