Question

I'm trying to install imagestore app in my project. Default models are created succefully, and all other parts working properly.

But, it have a feature to extend base (abstract) models and create your own by some complicated mechanism. This is mine model:

from django.db import models 
from imagestore.models.bases.album import BaseAlbum 
class Newalbum(BaseAlbum): 
    title = models.CharField("title", max_length=128) 
    class Meta(BaseAlbum.Meta): 
        app_label = "imagestore" 
        abstract = False

Also I have a string IMAGESTORE_ALBUM_MODEL = 'art.models.Newalbum' in my settings. When I run syncdb it tells me Backend module "art.models" does not define a "Newalbum" class. ('module' object has no attribute 'Newalbum'). But of course it defined.

And the strangeness is only begins. When I put debug statement in the place where imagestore trying to get my model it prints proper module (already imported) and proper class name (string). But! dir(mod) prints only variables appeared before "from imagestore.models.bases.album import BaseAlbum" .In above example only "models" and default underscored attributes. Why? What I don't know about importing modules?

I already tried to install it in many awkward combinations of settings properties, versions of django (and required apps), app_label and so on. It creates tables, when I doesn't add IMAGESTORE_ALBUM_MODEL in my settings, but this models hasn't any BaseClass' behaviour. So, what I'm doing wrong?

Was it helpful?

Solution

Solved it! While stepping through the import process (I added the following to imagestore.utils.load_class)

import pdb
pdb.set_trace()

I found that there is a circular import. Here's the order of things (slightly simplified):

  1. load_class(IMAGESTORE_ALBUM_MODEL)
  2. from imagestore.models.bases.album import BaseAlbum
  3. BaseAlbum has an FK to IMAGESTORE_IMAGE_MODEL (head), so it gets imported with load_class
  4. load_class(IMAGESTORE_IMAGE_MODEL)
  5. from imagestore.models.bases.image import BaseImage
  6. BaseImage has an FK to IMAGESTORE_ALBUM_MODEL (album), so it gets imported with load_class
  7. When this calls __import__ IMAGESTORE_ALBUM_MODEL is already in sys.modules, though incomplete because it's still being built. And thus the module doesn't have an "Album" attribute yet.

The quick solution is to move the head field to models.album.Album and remove it from BaseAlbum. After doing this I was able to get the site running again. You must use the models package in your new app (not a simple models.py), with Image and Album in separate files.

If this isn't clear enough, drop me a line and I'll try to do better.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top