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 并且一切正常。
谢谢大家的帮助!
我正在尝试使用自定义模型 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 并且一切正常。
谢谢大家的帮助!