在使用多个Django应用程序时如何修复“ ImportError”

时间:2019-02-05 18:47:47

标签: django python-3.x django-models python-packaging

我正在django中使用多个应用程序,并且在运行makemigrations命令时遇到了 ImportError
适用于import的语句如下:

accounting / models.py
    from activity.models import HistoryModel

activity / models.py
from user_management.models import Customer, Merchant, PassIssued
from accounting.models import ITMSCustomer

user_management / models.py
from accounting.models import Account, Transaction, Posting

我确定INSTALLED_APPS中列出的应用顺序很重要,并且顺序为:

'user_management',
'accounting',
'activity',

运行makemigrations命令时出现以下错误:

  File "/home/abhishek/citycash/city-server/src/cityserver/user_management/models.py", line 4, in <module>
    from accounting.models import Account, Transaction, Posting
  File "/home/abhishek/citycash/city-server/src/cityserver/accounting/models.py", line 17, in <module>
    from activity.models import HistoryModel
  File "/home/abhishek/citycash/city-server/src/cityserver/activity/models.py", line 4, in <module>
    from user_management.models import Customer, Merchant, PassIssued
ImportError: cannot import name 'Customer'

我尝试更改INSTALLED_APPS中应用程序的顺序,但是最终我得到了针对不同模块的ImportError。我知道这与所有三个应用程序都从彼此导入东西有关。如何解决此错误?
任何帮助表示赞赏。预先感谢。

2 个答案:

答案 0 :(得分:0)

从文档中:https://docs.djangoproject.com/en/2.1/ref/models/fields/#foreignkey

如果需要在尚未定义的模型上创建关系,则可以使用模型的名称,而不是模型对象本身:

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

要引用在另一个应用程序中定义的模型,可以显式指定带有完整应用程序标签的模型。例如,如果上面的制造商模型是在另一个称为生产的应用程序中定义的,则需要使用:

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'production.Manufacturer',
        on_delete=models.CASCADE,
    )

这种引用称为惰性关系,在解决两个应用程序之间的循环导入依赖性时很有用。

答案 1 :(得分:0)

为了帮助将来遇到相同问题的人,我最终创建了一个新应用(具有HistoryModelBaseHistoryModel等)并将其导入。欢迎其他任何建议。