我正在尝试使用自定义模型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默认用户模型的关系,我找不到有关此现象是否可能出现的任何信息。也许他们以特殊的方式对待它,并且不允许反向访问?
我真的很感谢您对此问题的帮助。
答案 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连接,并且一切正常。
不过谢谢大家的帮助!