2011-02-04 11 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はなぜこの1つの特定のファイルのようではないのですか?

(私はちょうど罰金コンソールに単独で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行目には 'mcif.models.account_import import AccountImport'はありません。 –

+0

権利。私はコメントアウトされた行を取り出して削除しました。それ以外は同じです。 –

+0

それから、これをやり直しましたか?同じエラーが発生した場合は、新しいトレースバックを投稿してください。このラインは、初めて実行したときにコメントアウトされていなかったか、実行されずにトレースバックに表示されていました。 –

答えて

2

あなたは循環インポートを持っています - mcif.models.generic_importmcif.models.account_importはお互いをインポートしようとしています。

PythonはJavaではないことを覚えておいてください。特に、これらの2つのように密接に関連している場合、1つのファイルに複数のクラスを持つことは非常にうれしいです。両方を単一のmcif.modelsファイルに入れてください。

+0

別の方法があるといいですね。私には30種類以上のモデルがあり、それぞれに独自のファイルがあります。同じファイルに2つのモデルがあるケースが1つしかないのは矛盾しているようです。 30以上のモデルをすべて同じファイルに入れるのは無責任なようです。その他の提案はありますか? –

+3

これは真剣にPythonを書く方法ではありません。モデルは論理的にアプリに分割する必要がありますが、1つのアプリ内ですべてを単一クラスのファイルに分割する必要はありません。 –

+1

私はすべてのモデルを1つのファイルに入れるべきだと言っていますか?もしそうなら、どうしたの? (明らかな循環参照問題の外に) –

0

あなたはそこに循環輸入しているようです。私はそれは正直、全然うまくいくのインポートかどうかはわかりませんけれども、再度AccountImportインポートGenericImportをインポート

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をインポートする必要がありますか?壊れた階層のようです。

編集:(更新用)

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には本当の意味でのコードはほとんどありませんが、ジェネリッククラスにはあなたの特定の実装についての知識や信頼はないはずです。

+0

はい、私はそれを見ていますが、 'AccountImport'から' GenericImport'への参照を取ると、 'AccountImport'は' GenericImport'について知らないと訴えます。私はその問題を解決する方法は考えられません。 –

+0

ジェネリッククラス( 'GenericImport')が特定のクラス(' AccountImport')について知っている必要はないはずですが、 'GenericImport'はどのように見えますか? –

+0

パターンは何と呼ばれていますか?私はそれをやっている方法の大きなファンではありませんが、私はそれをより良く考えることができなかったので、私はそれをやりました。 –

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') 

はForeignKeyの対象としてproductionモジュールからManufacturerモデルを使用します。

+0

それは良いアイデアのように見えますが、何らかの理由で動作しません:http://pastebin.com/4qvLjhr5何か考えてみませんか? –

+0

'models'はまだ' django.db'から来るはずです。あなたの例では 'mcif.models.ForeignKey'を使っています。独自のForeignKeyを実装していない限り、これは間違っています。 'from mcif.models.generic_import import GenericImport'行だけを外し、' mcif.models.generic_import.GenericImport'で外部キーの 'GenericImport'の直接参照を置き換えればよいのです。 –

関連する問題