Django ImportError:无法从部分初始化的模块“accounts.models”导入名称“ReporterProfile”(很可能是由于循环导入)

hivapdat  于 2023-04-22  发布在  Go
关注(0)|答案(7)|浏览(114)

我有两个APP:collectionaccounts,两者都定义了模型。我将模型ReporterProfileaccounts导入到collection。类似地,我将模型Reportcollection导入到accounts
collection中的Report模型在accounts中的模型类方法中被调用,如下所示:

from collection.models import Report

class ReporterProfile(models.Model):
    ....
    
    def published_articles_number(self):
        num = Report.objects.filter(reporterprofile=self.id).count()
        return num

类似地,我将ReporterProfileUser模型从accounts导入到collection模型,如下所示:

from accounts.models import ReporterProfile, User
from <project_name> import settings

class Report(models.Model):
    reporterprofile = models.ForeignKey(ReporterProfile, on_delete=models.CASCADE, verbose_name="Report Author")
    ...

class Comment(models.Model):
    report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Comment by")
    ...

当运行服务器或makemigrations时,我得到错误:

File "F:\project_name\accounts\models.py", line 8, in <module>
    from collection.models import Report

File "F:\project_name\collection\models.py", line 2, in <module>
    from accounts.models import ReporterProfile, User

ImportError: cannot import name 'ReporterProfile' from partially initialized module 'accounts.models' (most likely due to a circular import) (F:\project_name\accounts\models.py)

我认为错误是由于导入模式错误造成的。我该怎么办?

ovfsdjhp

ovfsdjhp1#

对于ForeignKey

您可以使用reporterprofile = models.ForeignKey("accounts.ReporterProfile", ...)代替reporterprofile = models.ForeignKey(ReporterProfile, ...),这样就不必导入模型。

防止循环导入错误:

而不是使用:

from accounts.models import ReporterProfile
[...]
foo = ReporterProfile()

您可以用途:

import accounts.models
[...]
foo = accounts.models.ReporterProfile()
von4xj4u

von4xj4u2#

确保你写的是create models nane,因为我遇到了同样的问题,当我看一下我的导入时,我写的是userFormdata而不是userformData(我大写了'f')

#wrong inport 
from users_handler.models import userFormData
#Correct import 
from users_handler.models import userformData
ss2ws0br

ss2ws0br3#

像下面这样导入模型

import collection

class ReporterProfile(models.Model):
    ....

    def published_articles_number(self):
        num = collection.models.Report.objects.filter(reporterprofile=self.id).count()
        return num

同样地

import accounts
from <project_name> import settings

class Report(models.Model):
    reporterprofile = models.ForeignKey(accounts.models.ReporterProfile, on_delete=models.CASCADE, verbose_name="Report Author")
    ...

class Comment(models.Model):
    report = models.ForeignKey(accounts.models.Report, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Comment by")
    ...
f3temu5u

f3temu5u4#

确保正确命名目录和文件名(不与django在启动过程中导入的其他模块或文件的名称冲突). I目录的名称app和一个文件random.py . Django在启动时会查找类似的东西,而不是获取实际的模块,如果最终在我创建的这个文件上。因此出现了错误或循环导入异常。

lfapxunr

lfapxunr5#

这是因为django是按步骤(顺序)处理代码的。对于循环导入,一个导入引用了另一个尚未示例化或安装的导入,因此会引发循环导入错误。简单的解决方法是根据django INSTALLED_APPS中应用程序的定义顺序,将导入代码放在需要它的类下面
这个
简单回答:

**from accounts.models import ReporterProfile, User**
from <project_name> import settings

class Report(models.Model):
    reporterprofile = models.ForeignKey(ReporterProfile, on_delete=models.CASCADE, verbose_name="Report Author")
    ...

class Comment(models.Model):
    report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Comment by")
    ...

    from collection.models import Report
should come after you have defined your ReportFile class in django

    class ReportFile():
       #fields

   **.... make the import either within the class at the start of the proptery function 
  ... or just directly below the class**
the pattern `from app_name.models import ClassModel` still works

第一行代码需要在accounts.models文件中进行处理,然后才能用于collections.models文件,因此导致了错误

  • 答案=〉错误的导入模式
    再一次,避免使用Python内置的类或函数名称,如在django中创建应用程序的集合,因为这可能会导致严重的技术问题
zlhcx6iw

zlhcx6iw6#

你应该检查导入功能.某处他们彼此崩溃.我有同样的问题.之后,我检查了导入功能,然后删除导入功能.之后,它工作正常.我只是与你分享我所面临的,并通过使用这种方式解决.

55ooxyrt

55ooxyrt7#

同样的问题也影响了我,在做了一些研究之后,我决定最好在我打算使用它的类中导入模型,而不是在顶部。
类似的东西

class WizardConfig(models.Model):
import docs.models
tenant = models.ForeignKey(Tenant, null=False, blank=False, on_delete=models.CASCADE)
consent1 = models.ForeignKey(docs.models.DocLib, null=True, blank=True, on_delete=models.CASCADE,related_name='consent1')

相关问题