Джанго по какой-то причине не хочет импортировать одну конкретную модель - PullRequest
1 голос
/ 04 февраля 2011

У меня есть модель 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

Почему Джанго не нравится этот отдельный файл?

(я могу нормально загрузить 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 ]

2 голосов
/ 04 февраля 2011

У вас есть круговой импорт - mcif.models.generic_import и mcif.models.account_import пытаются импортировать друг друга.

Помните, что Python не Java, и он очень рад иметь несколько классов в одном файле, особенноесли они тесно связаны, как эти двое кажутся.Поместите их обоих в один mcif.models файл.

2 голосов
/ 04 февраля 2011

Это круговая модель зависимости.

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 в качестве цели для внешнего ключа.

0 голосов
/ 04 февраля 2011

Похоже, у вас там круговой импорт.

  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 на самом деле почти не имеет места в реальном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...