1

我正在尝试在我的项目中安装 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”类。(“模块”对象没有属性“新专辑”)。但当然它定义了。

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

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

4

1 回答 1

1

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

import pdb
pdb.set_trace()

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

  1. 加载类(IMAGESTORE_ALBUM_MODEL)
  2. 从 imagestore.models.bases.album 导入 BaseAlbum
  3. BaseAlbum 对 IMAGESTORE_IMAGE_MODEL (head) 有一个 FK,因此它使用 load_class 导入
  4. load_class(IMAGESTORE_IMAGE_MODEL)
  5. 从 imagestore.models.bases.image 导入 BaseImage
  6. BaseImage 具有 IMAGESTORE_ALBUM_MODEL(专辑)的 FK,因此它使用 load_class 导入
  7. 当此调用时 __import__ IMAGESTORE_ALBUM_MODEL 已经在 sys.modules 中,虽然不完整,因为它仍在构建中。因此该模块还没有“专辑”属性。

快速的解决方案是将 head 字段移动到 models.album.Album 并将其从 BaseAlbum 中删除。完成此操作后,我能够让网站再次运行。您必须在新应用程序中使用模型包(不是简单的 models.py),图像和相册位于单独的文件中。

如果这还不够清楚,请给我留言,我会努力做得更好。

于 2012-05-14T03:03:04.690 回答