mhost
mhost

Reputation: 7230

Django ImportError looks like a loop

In my django project I have the following:

apps1/models.py: Post (model)
apps2/models.py: Blogs (model)
apps2/functions.py: get_blogs (method)

The apps1/models.py file imports the Blogs model from apps2/models.py.
The apps2/models.py file imports the get_blogs method from apps2/functions.py.
The apps2/functions.py file import the Post model from apps1/models.py.

I am getting the following error:

ImportError at /
cannot import name Post

Traceback
admin.autodiscover()
<in file apps1/models.py>
from apps2.models import Blogs
<in file apps2/models.py>
from apps2.functions import get_blogs
<in file apps2/functions.py>
from apps1.models import Post

I thought it might be that the admin.autodiscover is importing the Post model first and then through an import loop, it is trying to import it again. Although I tried changing it to:

from apps1.models import Post as OtherPost

but that didn't help. Any idea why this is happening? Is it because there is a loop now?

Upvotes: 0

Views: 1698

Answers (1)

koniiiik
koniiiik

Reputation: 4382

If the only reason you import Blogs in apps1.models is that you have a relationship field in Post, how about using a lazy relationship instead? As far as I understand, those were designed specifically to deal with import loops like the one you're experiencing.

It is quite easy, instead of

from apps2.models import Blogs
...
class Post(models.Model):
    ...
    my_blog = models.ForeignKey(Blogs)

you use something like this:

class Post(models.Model):
    ...
    my_blog = models.ForeignKey("apps2.Blogs")

Upvotes: 8

Related Questions