Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django出于某种原因没有';我不想导入一个特定的模型_Python_Django - Fatal编程技术网

Python Django出于某种原因没有';我不想导入一个特定的模型

Python Django出于某种原因没有';我不想导入一个特定的模型,python,django,Python,Django,我有一个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 #fro

我有一个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
一般导入

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

看起来这里有一个循环导入

  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

eval
行充满了不良做法的味道。这里当然有一个比这个更好的模式。您的泛型类不应该对您的特定实现有任何知识或依赖,更不用说
eval
在实际代码中几乎没有位置。

您有一个循环导入-
mcif.models.generic\u import
mcif.models.account\u import
正在尝试彼此导入


请记住,Python不是Java,并且非常乐意在一个文件中包含多个类,特别是如果它们像这两个类一样密切相关的话。将它们放在一个
mcif.models
文件中。

这是一个循环模型依赖项

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

将使用
生产
模块中的
制造商
模型作为外键的目标。

是的,我看到了,但是如果我从
会计导入
中引用
一般导入
,它会抱怨
会计导入
不知道
一般导入
。我想不出任何方法来解决这个问题。我想说你的泛型类(
GenericImport
)不应该知道特定的类(
AccountImport
),它看起来像什么?知道这个模式叫什么吗?我也不太喜欢我这样做,但我这样做是因为我想不出更好的办法。在这一点上,最好在这里提出一个新问题,我目前还没有答案。你的mcif/models/_init__;py是什么样子的?Django只在.models中查找模型,这可以解释为什么它找不到您的模型。尝试将它们导入mcif/models/_init__.py。我希望有另一种方法。我有30多种不同的型号,每种型号都有自己的文件。如果只有一个案例,我在同一个文件中有两个模型,这似乎是不一致的。将所有30多个模型放在同一个文件中似乎也是不负责任的。还有其他建议吗?说真的,这不是编写Python的方法。模型应该在逻辑上划分为应用程序,而不是在单个应用程序中划分为单个类文件。你是说我应该将所有模型放在一个文件中?如果是,为什么?(除了明显的循环引用问题外)要么是因为遇到问题而修改了
GenericImport
,要么就是这个文件不正确。此文件的第6行中没有来自mcif.models.account\u import AccountImport的
。右侧。我把注释掉的行删除了。除此之外,它是相同的。那么你在那之后重试过这个吗?如果遇到相同的错误,请发布新的回溯。当你第一次运行它时,这行显然没有被注释掉,否则它就不会执行并在回溯中显示。是的,我在发布问题之前尝试了两种方法。如果我不导入
AccountImport
specific_import()
将不起作用,因为
GenericImport
不知道
TransactionImport
AccountImport
。是的,请看我更新的答案-这是一个糟糕的设计(这不会起作用并非巧合)。有一个更好的模式存在,你可以传入一个类列表进行检查(仍然不是很好),或者你可以有一个单独的类来管理它。这看起来是个好主意,但由于某些原因它不起作用:知道为什么不可以吗?
模型
仍然应该来自
django.db
。在您的示例中,您使用的是
mcif.models.ForeignKey
。除非您实现了自己的ForeignKey,否则这是不正确的。您只需从mcif.models.generic\u导入GenericImport
行中删除
,并将foreignkey中的
GenericImport
的直接引用替换为
mcif.models.generic\u导入GenericImport
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
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
class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')