2011-02-04 63 views
1

我有一個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 
#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 
+0

要麼你,因爲你碰到了問題,修改`GenericImport`或者這是不正確的文件。這個文件的第6行沒有`from mcif.models.account_import import AccountImport`。 – 2011-02-04 16:32:15

+0

沒錯。我把註釋掉的行刪除了。除此之外,它是相同的。 – 2011-02-04 16:35:30

+0

那麼你在那之後重試了嗎?如果遇到相同的錯誤,請發佈新的回溯。當你第一次運行它時,這條線顯然沒有被註釋掉,或者它不會被執行並顯示在回溯中。 – 2011-02-04 16:36:57

回答

2

你有一個循環導入 - mcif.models.generic_importmcif.models.account_import正試圖導入對方。

請記住,Python不是Java,並且很高興在單個文件中有多個類,特別是如果它們緊密相關,就像這兩個似乎一樣。把它們放在一個mcif.models文件中。

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其中進口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') 

將使用Manufacturer模型從production模塊作爲外鍵的目標。

相關問題