Django OneToOne 字段 - AUTH_USER_MODEL 没有反向访问器

Django OneToOne field - no reverse accessor to AUTH_USER_MODEL

我正在尝试使用自定义模型 UserProfile 扩展 settings.AUTH_USER_MODEL 引用的 Django 的默认 UserModel。 在每种情况下,我都使用 OneToOne-Relationship,我也会在引用模型上获得一个访问器。所以这通常有效:

class ModelA(models.Model):
   text = models.CharField(max_length=100)

class ModelB(models.Model):
   link_to_model_a = models.OneToOneField(ModelA, on_delete=models.CASCADE)


model_a = ModelA()
model_a.modelb  # Works fine

但在这种情况下不起作用(代码段缩短):

class UserProfile(models.Model):
    # There are more fields, but removed
    # for this example

    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )


from django.contrib.auth import get_user_model
get_user_model().userprofile # Causes AttributeError: type object 'User" has no attribute 'userprofile'

由于与 django 默认用户模型的关系,我找不到任何关于这种现象是否会出现的信息。也许他们特殊对待,不允许反向访问?

非常感谢您在这方面的帮助。

原因是,get_user_model() returns class User 而不是 User()。因此,您无法访问 userprofile.

它正在尝试访问 User 中名称为 userprofile 的静态属性。

尝试直接添加关系 yo YourCustomUserModel 以防您使用的是特定关系,否则您可以只添加 User 模型:

from my_app import YourCustomUserModel

class UserProfile(models.Model):
    # There are more fields, but removed
    # for this example

    user = models.OneToOneField(
        YourCustomUserModel,
        on_delete=models.CASCADE
    )

如果使用默认用户模型,您可以使用:

from django.contrib.auth.models import User  # check this line

class UserProfile(models.Model):
    # There are more fields, but removed
    # for this example

    user = models.OneToOneField(
        User,  # check this line
        on_delete=models.CASCADE
    )

并且因为您不会(或从不)如此频繁地更改您的用户 AUTH_USER_MODEL,所以您不会有任何问题,请记住,如果您有任何机会必须使用另一个用户,也请在这里更改它.

我能够自己找到解决方案。

在这种情况下,我将模型拆分为单独的文件。我在我的 /models/ 目录中使用了一个 __ init __.py 文件,但没有在 __ init __.py.

中明确导入我的所有模型

这样做之后,Django 可以从 UserProfile 找到我的 OneToOne-connection 到它的 User-model 并且一切正常。

谢谢大家的帮助!