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"
    )