在另一个应用模型中导入应用模型类
Posted
技术标签:
【中文标题】在另一个应用模型中导入应用模型类【英文标题】:Import app model class in another app model 【发布时间】:2012-12-02 11:58:26 【问题描述】:我有 2 个应用程序:coworkers 和 services,每个都有自己的 models.py
在 coworkers models.py 中,我可以“从 services.models 导入服务”。
当我尝试在 services models.py 中“从 coworkers.models 导入状态”时,我收到以下错误消息:
Traceback(最近一次调用最后一次):文件 “/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/core/management/commands/runserver.py”, 第 91 行,inner_run self.validate(display_num_errors=True) 文件“/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/core/management /base.py", 第 266 行,有效 num_errors = get_validation_errors(s, app) 文件“/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/core/management /验证.py", 第 30 行,在 get_validation_errors 中 for (app_name, error) in get_app_errors().items(): 文件 "/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7. egg/django/db/models/loading.py”,第 158 行,在 get_app_errors 中 self._populate() 文件“/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/db/models/loading. py",第 64 行,在 _populate 中 self.load_app(app_name, True) 文件“/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/db/models /loading.py",第 88 行,在 load_app 中 models = import_module('.models', app_name) 文件“/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/实用程序/importlib.py", 第 35 行,在 import_module 中 导入(名称)文件“/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/coworkers/models.py”, 第 2 行,在 从 services.models 导入服务文件“/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py”, 第 5 行,在 类服务(models.Model):文件“/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py”, 第 11 行,在服务中 status = models.ForeignKey(Status) NameError: name 'Status' is not defined
--
同事 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
服务模型.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
-- 有人可以帮我看看我做错了什么吗?
提前致谢!
【问题讨论】:
这是一个相当古老的问题和 django 的演变。 ***.com/a/43847288/2644091 提供了避免新版本 django 导入问题的工具(答案中的第 3 个注释是为我解决了这个问题中的问题)。 【参考方案1】:这是由 Python 中的循环导入引起的。 您可以使用以下语法:
status = models.ForeignKey('coworkers.models.Status')
Django 将使用此路径确定模型,因此您无需导入 Status。
在您的情况下,另一个解决方案是删除 coworker.models 中的第二个导入语句,因为此文件中似乎没有使用服务。
【讨论】:
其实是用的……我只是没有把整个文件贴出来! :) 我明白了,但无论如何都没有用......我将它更改为一个名为“is_cative”的新字段作为布尔值,现在它解决了我的问题(这个问题有点但紧急)。奇怪的是它没有像你说的那样工作...... =/【参考方案2】:在 Django 1.6.5 中:
import coworkers
status = models.ForeignKey(coworkers.models.Status)
应该是这样的:
import coworkers
status = models.ForeignKey(coworkers.Status)
我(现在)知道 OP 正在使用 Django 1.4.3,并且某些答案可能会在该版本的 Django 中解决这个问题。但是,我花了一段时间才注意到版本,这些答案在 1.6.5 中不起作用。
干杯!
【讨论】:
我想你可能忘记了引号,status = models.ForeignKey("coworkers.Status")【参考方案3】:循环导入,会报错。
你可以试试,
import coworkers
status = models.ForeignKey(coworkers.models.Status)
【讨论】:
所以如果我已经在之前的models.py中导入了这个当前的模型类,我永远不能在另一个应用程序models.py中导入模型类? :S 这真的很烦人... :) 现在我得到了这个: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'
A导入B,那么B不能导入A,否则就ok了。
尝试 status = models.ForeignKey("coworkers.models.Status") 或 status = models.ForeignKey("coworkers.Status")
好吧,这仍然是一个导入问题。我不太确定发生了什么..我曾经遇到过这些错误,一个快速而肮脏的解决方案就是将它们放在一个文件中..【参考方案4】:
只需先创建状态模型并执行同步数据库,然后创建服务模型和同步数据库。它应该可以工作。
问题在于 python 无法找到“状态”,因为它第一次尝试创建服务模型。
【讨论】:
【参考方案5】:我在做syncdb时遇到了各种各样的错误:
CommandError: One or more models did not validate: parts.vehicle:
'customer' has a relation with model <class
'customers.models.Customer'>, which has either not been installed or
is abstract.
我终于意识到我忘记将新应用添加到 settings.py。管理员也找不到。这应该是我的第一个线索。否则,我正在做 e.thompsy 为 django 1.6.5 提供的答案
【讨论】:
以上是关于在另一个应用模型中导入应用模型类的主要内容,如果未能解决你的问题,请参考以下文章