I have a Django model where I’m importing a number of items:
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
It works fine, but when I uncomment that line that’s commented, I get this:
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
Why doesn’t Django like this one particular file?
(I can load AccountImport by itself on the console just fine.)
Also, here’s AccountImport if it helps to see it:
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'
And 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
You have a circular import –
mcif.models.generic_importandmcif.models.account_importare trying to import each other.Remember that Python is not Java, and is quite happy to have multiple classes in a single file, especially if they’re closely related like these two seem to be. Put them both in a single
mcif.modelsfile.