在另一个应用模型中导入应用模型类

时间:2012-12-14 13:16:33

标签: django django-models

我有2个应用:同事服务,每个都有自己的models.py

在同事models.py中,我可以“从services.models导入服务”。

当我在服务models.py中尝试“from coworkers.models import Status”时,收到以下错误消息:

  

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)File“/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 /validation.py”   第30行,在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。在get_app_errors中,egg / django / db / models / loading.py“,第158行       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)File“/Users/lucas/Documents/projetos/cwk-manager/lib/python2.7/site-packages/Django-1.4.3-py2.7.egg/django/ utils的/ 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号线,在       class Services(models.Model):文件“/Users/lucas/Documents/projetos/cwk-manager/cwk-manager/cwk_manager/services/models.py”,   第11行,在服务中       status = models.ForeignKey(Status)NameError:名称'Status'未定义

-

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

服务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

- 有人可以帮我看看我做错了吗?

提前致谢!

5 个答案:

答案 0 :(得分:10)

这是由Python中的循环导入引起的。 您可以使用以下语法:

status = models.ForeignKey('coworkers.models.Status')

Django将使用此路径确定模型,因此您无需导入状态。

您的案例中的另一个解决方案是删除coworker.models中的第二个import语句,因为此文件中似乎没有使用Services。

答案 1 :(得分:10)

在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中不起作用。

干杯!

答案 2 :(得分:1)

循环导入,导致错误。

你可以尝试,

import coworkers
status = models.ForeignKey(coworkers.models.Status)

答案 3 :(得分:0)

首先创建Status模型并执行syncdb,然后创建服务模型和syncdb。它应该工作。

问题在于,python无法在首次尝试创建服务模型时找到“状态”。

答案 4 :(得分:0)

我在执行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.管理员也找不到它。这应该是我的第一个线索。否则我正在为django 1.6.5

做e.thompsy的答案