如何克服 ImportError?

How to overcome a ImportError?

在我的项目中,我想实现一个自定义用户模型,它包含在我的用户应用程序中并包含在我的设置中,它有一个当前正在处理的项目的条目。所以我的用户模型应该是这样的

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: cannot import name 'User' from 'users.models' 这显然是因为引用在我的用户模型中,然后由于其他引用而尝试导入用户模型。 所以我的想法是在 api 应用程序中创建一个新的 UserSetting 模型,例如

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

因此,当您尝试在关系中使用自定义用户模型时,根据 docs you should reference it via settings.AUTH_USER_MODEL. This should have been set if you followed the official guide on using custom user models here

编辑:

所以你的代码最终看起来像:

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

通过这种方式引用您的用户模型,您实际上是在使用您在配置中设置的字符串。 Django 将为您整理对正确模型的引用。