Python 如何克服恐惧?
在我的项目中,我想实现一个自定义用户模型,该模型包含在我的用户应用程序中,并包含在我的设置中,其中包含当前正在处理的项目的条目。所以我的用户模型应该是这样的Python 如何克服恐惧?,python,django,foreign-keys,django-custom-user,Python,Django,Foreign Keys,Django Custom User,在我的项目中,我想实现一个自定义用户模型,该模型包含在我的用户应用程序中,并包含在我的设置中,其中包含当前正在处理的项目的条目。所以我的用户模型应该是这样的 from django.db import models from django.contrib.auth.models import AbstractUser from api.models import Project class User(AbstractUser): current_project = models.F
from django.db import models
from django.contrib.auth.models import AbstractUser
from api.models import Project
class User(AbstractUser):
current_project = models.ForeignKey(
Project,
on_delete=models.SET_NULL,
null=True,
)
而我在api应用程序中的项目模型基本上看起来
from django.db import models
from users.models import User
class Project(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name="api_project_author",
related_query_name="api_project_authors"
)
edited_at = models.DateTimeField(blank=True, null=True)
editor = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="api_project_editor",
related_query_name="api_project_editors"
)
但是,如果我运行此操作,我会得到一个ImportError:无法从“users.models”导入名称“User”,这显然是由于我的用户模型中的引用而发生的,而该用户模型由于其其他引用而尝试导入该用户模型。
所以我的想法是在api应用程序中创建一个新的用户设置模型,如
class UserSetting(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.SET_NULL, null=True)
然而,我不知道如何正确处理或避免此类问题
我使用的是Django 2.2和Python 3.7.3,因此当您尝试在关系中使用自定义用户模型时,根据,您应该通过
设置来引用它。AUTH_user_model
。如果您遵循有关使用自定义用户模型的官方指南,则应该设置此选项
编辑:
因此,您的代码最终将看起来像:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
current_project = models.ForeignKey(
'api.Project',
on_delete=models.SET_NULL,
null=True,
)
通过以这种方式引用用户模型,实际上使用的是在配置中设置的字符串。Django将为您整理对正确模型的引用。您是否为您的自定义用户指定了
AUTH\u USER\u model=app\u name.USER”?您可以使用
AUTH_USER_MODEL`而不是USER
,我不建议声明自定义用户模型的名称与自己的django用户模型名称一致AUTH_USER_MODEL='users.USER'
是我写“包括到我的设置中”时的意思。好的。尝试从django.conf导入设置和author=models.ForeignKey(settings.AUTH\u USER\u MODEL,…)
-因此错误仍然存在?将模型中的用户更改为“users.USER”。这称为惰性关系,在循环导入的情况下很方便。这就是我在编写“包含到我的设置”时的意思。因此,在您的模型中。ForeignKey
声明中,您可以替换对模型的直接引用。django中外键和其他关系的一点是,您实际上可以通过应用程序名称引用它们。例如,我在我的一个项目中有以下声明:data=models.ForeignKey('data.data',…)
。Django将为您整理对应用程序和模型的引用。
from django.conf import settings
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
related_name="api_project_author",
related_query_name="api_project_authors"
)
edited_at = models.DateTimeField(blank=True, null=True)
editor = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="api_project_editor",
related_query_name="api_project_editors"
)