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

时间:2020-08-07 11:30:49

标签: django model relation

我正在尝试使用自定义模型UserProfile扩展Django的默认UserModel(由settings.AUTH_USER_MODEL引用)。 在每种情况下,我都使用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'

由于与djangos默认用户模型的关系,我找不到有关此现象是否可能出现的任何信息。也许他们以特殊的方式对待它,并且不允许反向访问?

我真的很感谢您对此问题的帮助。

3 个答案:

答案 0 :(得分:0)

这样做的原因是,onDataSetChanged返回类get_user_model()而不是User。因此,您无法访问User()

它正在尝试访问名称为userprofile的{​​{1}}中存在的静态属性。

答案 1 :(得分:0)

如果您使用的是特定关系,请尝试直接添加关系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进行太多更改(或永远不会更改),因此不会有任何问题,请记住也要在此处进行更改,以防万一您不得不使用另一个用户。 / p>

答案 2 :(得分:0)

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

在这种情况下,我将模型分成单独的文件。我在/ models /目录中使用了__ init __.py文件,但没有在__ init __.py中明确导入所有模型。

这样做之后,Django可以找到我从UserProfile到其User-Model的OneToOne连接,并且一切正常。

不过谢谢大家的帮助!

相关问题