Django出于某种原因不想导入某个特定模型

2 投票
3 回答
3323 浏览
提问于 2025-04-16 11:14

我有一个Django模型,我在里面导入了一些项目:

from django.db import models
from mcif.models.import_profile import ImportProfile
from mcif.models.import_file import ImportFile
from mcif.models.import_bundle import ImportBundle
from mcif.models.customer import Customer
#from mcif.models.account_import import AccountImport
from mcif.models.csv_row import CSVRow
import csv, cStringIO

这个部分运行得很好,但当我把那行注释去掉时,就出现了这个问题:

Traceback (most recent call last):
  File "./manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/usr/lib/pymodules/python2.6/django/core/management/commands/shell.py", line 18, in handle_noargs
    loaded_models = get_models()
  File "/usr/lib/pymodules/python2.6/django/db/models/loading.py", line 167, in get_models
    self._populate()
  File "/usr/lib/pymodules/python2.6/django/db/models/loading.py", line 64, in _populate
    self.load_app(app_name)
  File "/usr/lib/pymodules/python2.6/django/db/models/loading.py", line 78, in load_app
    models = import_module('.models', app_name)
  File "/usr/lib/pymodules/python2.6/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/home/jason/projects/mcifdjango/mcif/models/__init__.py", line 5, in <module>
    from mcif.models.account_import import AccountImport
  File "/home/jason/projects/mcifdjango/mcif/models/account_import.py", line 2, in <module>
    from mcif.models.generic_import import GenericImport
  File "/home/jason/projects/mcifdjango/mcif/models/generic_import.py", line 6, in <module>
    from mcif.models.account_import import AccountImport
ImportError: cannot import name AccountImport

为什么Django对这个特定的文件不喜欢呢?

(我可以在控制台上单独加载AccountImport,没有问题。)

另外,这里是AccountImport的内容,如果有帮助的话:

from django.db import models
from mcif.models.generic_import import GenericImport

class AccountImport(models.Model):

    id = models.BigIntegerField(primary_key=True)
    generic_import = models.ForeignKey(GenericImport)
    is_entirely_international = models.IntegerField()
    is_queued = models.IntegerField()
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField()

    class Meta:
        db_table = u'account_import'
        app_name = 'mcif'

还有GenericImport

from django.db import models
from mcif.models.import_profile import ImportProfile
from mcif.models.import_file import ImportFile
from mcif.models.import_bundle import ImportBundle
from mcif.models.customer import Customer
from mcif.models.csv_row import CSVRow
import csv, cStringIO

class GenericImport(models.Model):

    class Meta:
        db_table = u'generic_import'
        app_name = 'mcif'

    id = models.BigIntegerField(primary_key=True)
    import_profile = models.ForeignKey(ImportProfile)
    import_file = models.ForeignKey(ImportFile)
    notes = models.TextField()
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    active = models.IntegerField()
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField()
    unsavable_rows = models.TextField()
    import_bundle = models.ForeignKey(ImportBundle)
    is_queued = models.IntegerField()

    @classmethod
    def last(cls):
        all = GenericImport.objects.all()
        return all[len(all) - 1]

    def process(self):
        for line in self.import_file.file.split("\n")[:30]:
            f = cStringIO.StringIO(line)
            row = CSVRow()
            row.array = next(csv.reader(f))
            row.generic_import = self
            row.process()
            f.close()

    def specific_import(self):
        for model_name in ['TransactionImport', 'AccountImport']:
            specific_imports = eval(model_name + '.objects.filter(generic_import__pk=5)')
            if len(specific_imports) > 0:
                return specific_imports[0]
        return False

3 个回答

0

看起来你遇到了一个循环导入的问题。

  File "/home/jason/projects/mcifdjango/mcif/models/__init__.py", line 5, in <module>
    from mcif.models.account_import import AccountImport
  File "/home/jason/projects/mcifdjango/mcif/models/account_import.py", line 2, in <module>
    from mcif.models.generic_import import GenericImport
  File "/home/jason/projects/mcifdjango/mcif/models/generic_import.py", line 6, in <module>
    from mcif.models.account_import import AccountImport

你的 __init__.py 文件导入了 AccountImport,然后 AccountImport 又导入了 GenericImport,接着 GenericImport 又回过头来导入 AccountImport。老实说,我不太明白这样导入到底是怎么工作的。

你的 GenericImport 真的需要导入 AccountImport 吗?这看起来像是层级结构出了问题。

编辑: (关于更新的内容)

def specific_import(self):
    for model_name in ['TransactionImport', 'AccountImport']:
        specific_imports = eval(model_name + '.objects.filter(generic_import__pk=5)')
        if len(specific_imports) > 0:
            return specific_imports[0]
    return False

那行 eval 看起来是个坏习惯。这里肯定有比这个更好的写法。你的通用类不应该对具体的实现有任何了解或依赖,更不用说 eval 在实际代码中几乎没有用武之地。

2

这是一个循环模型依赖的问题。

File "/home/jason/projects/mcifdjango/mcif/models/__init__.py", line 5, in <module>
    from mcif.models.account_import import AccountImport
File "/home/jason/projects/mcifdjango/mcif/models/account_import.py", line 2, in <module>
    from mcif.models.generic_import import GenericImport
File "/home/jason/projects/mcifdjango/mcif/models/generic_import.py", line 6, in <module>
    from mcif.models.account_import import AccountImport
ImportError: cannot import name AccountImport

如果你真的需要把这些模型分开,可以看看这个链接:http://docs.djangoproject.com/en/1.2/ref/models/fields/#django.db.models.ForeignKey,里面有解决方案。你可以用字符串来引用模型,而不是直接导入它。

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

将使用来自production模块的Manufacturer模型作为外键的目标。

3

你遇到了一个循环导入的问题——mcif.models.generic_importmcif.models.account_import这两个文件正在互相导入对方。

要记住,Python和Java不一样,Python很乐意把多个类放在一个文件里,特别是当这些类之间关系很紧密的时候。你可以把这两个类都放在一个mcif.models文件里。

撰写回答