扩展imagestore模型

时间:2012-04-20 16:39:26

标签: django django-models django-apps django-inheritance

我正在尝试在我的项目中安装imagestore应用程序。默认模型创建成功,所有其他部分正常工作。

但是,它有一个扩展基础(抽象)模型的功能,并通过一些复杂的机制创建自己的模型。这是我的模型:

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

我的设置中还有一个字符串IMAGESTORE_ALBUM_MODEL = 'art.models.Newalbum'。 当我运行syncdb时,它告诉我后端模块“art.models”没有定义“Newalbum”类。 ('module'对象没有属性'Newalbum')。 但当然它定义了。

陌生感才刚刚开始。当我将调试语句放在imagestore试图获取我的模型的地方时,它会打印正确的模块(已导入)和正确的类名(字符串)。但! dir(mod)仅打印“from imagestore.models.bases.album import BaseAlbum”之前出现的变量。在上面的示例中,仅显示“models”和默认的下划线属性。为什么?关于导入模块,我不知道什么?

我已经尝试将它安装在许多设置属性,django(和所需应用程序)版本,app_label等的笨拙组合中。当我在我的设置中没有添加IMAGESTORE_ALBUM_MODEL时,它会创建表,但是这个模型没有任何BaseClass的行为。 那么,我做错了什么?

1 个答案:

答案 0 :(得分:1)

解决了!逐步完成导入过程(我将以下内容添加到imagestore.utils.load_class)

import pdb
pdb.set_trace()

我发现有一个循环导入。这是事物的顺序(略微简化):

  1. load_class(IMAGESTORE_ALBUM_MODEL)
  2. 来自imagestore.models.bases.album导入BaseAlbum
  3. BaseAlbum的FK为IMAGESTORE_IMAGE_MODEL(头部),因此使用load_class
  4. 导入
  5. load_class(IMAGESTORE_IMAGE_MODEL)
  6. from imagestore.models.bases.image import BaseImage
  7. BaseImage有一个FK到IMAGESTORE_ALBUM_MODEL(相册),所以它用load_class导入
  8. 当调用__import__时,IMAGESTORE_ALBUM_MODEL已经在sys.modules中,虽然不完整,因为它仍在构建中。因此该模块还没有“相册”属性。
  9. 快速解决方案是将head字段移动到models.album.Album并将其从BaseAlbum中删除。在这样做后,我能够让网站再次运行。您必须在新应用中使用模型包(不是简单的models.py),将Image和Album放在单独的文件中。

    如果这还不够清楚,请告诉我一行,我会尽力做得更好。