如何克服 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 将为您整理对正确模型的引用。
在我的项目中,我想实现一个自定义用户模型,它包含在我的用户应用程序中并包含在我的设置中,它有一个当前正在处理的项目的条目。所以我的用户模型应该是这样的
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 将为您整理对正确模型的引用。