在另一个应用的模型中导入应用模型类。
在另一个应用的模型中导入应用模型类。
我有两个应用程序:coworkers和services,每个应用程序都有自己的models.py文件。
在coworkers models.py文件中,我可以使用"from services.models import Services"。
当我在services models.py文件中尝试使用"from coworkers.models import Status"时,我收到以下错误消息:
Traceback (most recent call last): File
"/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/core/management/commands/runserver.py",
line 91, in inner_run
self.validate(display_num_errors=True) File "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/core/management/base.py",
line 266, in validate
num_errors = get_validation_errors(s, app) File "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/core/management/validation.py",
line 30, in get_validation_errors
for (app_name, error) in get_app_errors().items(): File "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/db/models/loading.py", line 158, in get_app_errors
self._populate() File "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/db/models/loading.py", line 64, in _populate
self.load_app(app_name, True) File "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/db/models/loading.py", line 88, in load_app
models = import_module('.models', app_name) File "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/utils/importlib.py",
line 35, in import_module
import(name) File "/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/coworkers/models.py",
line 2, in
from services.models import Services File "/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py",
line 5, in
class Services(models.Model): File "/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py",
line 11, in Services
status = models.ForeignKey(Status) NameError: name 'Status' is not defined
--
coworker models.py
from django.db import models from services.models import Services class Status(models.Model): status_name = models.CharField(max_length=50) status_description = models.TextField(blank=True, null=True) class Meta: verbose_name = "Status" verbose_name_plural = "Status" def __unicode__(self): return self.status_name
services models.py
from django.db import models from coworkers.models import Status # This table contains all the information about plans and other general services provided. class Services(models.Model): service_name = models.CharField(max_length=100) service_description = models.TextField(blank=True, null=True) service_price = models.DecimalField(max_digits=7, decimal_places=2, blank=True, null=True) creation_date = models.DateField(auto_now_add=True) last_update = models.DateField(auto_now=True) status = models.ForeignKey(Status) class Meta: verbose_name = "Services" verbose_name_plural = "Services" def __unicode__(self): return self.service_name
--
有人可以帮我看看我做错了什么吗?
提前谢谢!
在一个应用程序的models.py文件中,如果已经导入了当前模型类并且尝试再次导入另一个应用程序的模型类,就会出现循环导入的问题,从而导致错误。解决这个问题的方法是使用字符串引用模型类,或者将所有相关的模型类放在同一个文件中。
循环导入问题可以通过以下代码解决:
import coworkers status = models.ForeignKey(coworkers.models.Status)
然而,这仍然是一个导入问题,具体发生了什么我不太确定...我过去遇到过这些错误,一个快速而简单的解决方法就是将它们放在同一个文件中。
现在我得到了以下错误信息:
File "/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/coworkers/models.py", line 2, in <module> from services.models import Services File "/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py", line 5, in <module> class Services(models.Model): File "/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py", line 11, in Services status = models.ForeignKey(coworkers.models.Status) AttributeError: 'module' object has no attribute 'models'
这是一个导入问题,如果我已经在之前的models.py文件中导入了当前模型类,那么我就不能在另一个应用程序的models.py文件中导入这个模型类吗?这真的很烦人... 🙂
总结起来,解决循环导入问题的方法是使用字符串引用模型类或将所有相关的模型类放在同一个文件中。
在Django 1.6.5中,出现这个问题的原因是在导入应用程序的模型类时,模型类的引用方式不正确。解决方法是更改导入的模型类的引用方式。
如果代码如下:
import coworkers status = models.ForeignKey(coworkers.models.Status)
应该更改为:
import coworkers status = models.ForeignKey(coworkers.Status)
这个问题的解决方法适用于Django 1.6.5版本。在Django 1.4.3版本中,可能有其他解决方法,但这些解决方法不适用于1.6.5版本。
另外,也可以使用引号来引用模型类,如下所示:
status = models.ForeignKey("coworkers.Status")
这样也可以解决该问题。
在Python中,这是由于循环导入引起的。
你可以使用以下语法:
status = models.ForeignKey('coworkers.models.Status')
Django将使用这个路径来确定模型,所以你不需要导入Status。
在你的情况下,另一种解决方法是删除coworker.models中的第二个导入语句,因为Services似乎在这个文件中没有被使用。
实际上它被使用了...我只是没有贴出整个文件! 🙂
我明白了,但是还是不起作用...我将它改为一个名为"is_active"的布尔字段,现在它解决了我的问题(这个问题有点紧急)。奇怪的是它没像你说的那样起作用... =/