1

我有一个抽象的 Container 类,它允许派生模型保存一些内容块,例如图像、文本等,它们也是单独的模型。对于数据库整洁,我希望将这些模型的表标记为 content_block_image、content_block_text 等。

但是当我app_label = 'content_block'在 Content 模型的 Meta 类中指定时,在 syncdb 期间出现错误:

content.event: 'content' 与模型 Content 具有 m2m 关系,该模型要么尚未安装,要么是抽象的。

我声明以下基类如下:

# base.py
class Content(models.Model):
    tags = models.TextField(_('tags'), blank=True)
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType, 
                                     related_name='%(class)s_content_set')

    container_type = models.ForeignKey(ContentType)
    container_id = models.PositiveIntegerField()
    container = generic.GenericForeignKey('container_type', 'container_id')

    class Meta:
        app_label = 'content_block'

class Container(models.Model):
    content_type = models.ForeignKey(ContentType, 
                                     related_name='%(class)s_container_set')
    content = generic.GenericRelation('Content', 
                                      content_type_field='container_type', 
                                      object_id_field='container_id')
    class Meta:
        abstract = True

然后,在我的模型中,我声明了我称之为容器的模型,例如:

# models.py
class Event(Container):
    title = models.CharField(max_length=100)
    start = models.DateTimeField()
    end = models.DateTimeField()

如果我删除app_labelsyncdb 运行没有问题。看来 app_label 不仅仅是一个标签。

关于如何使用 Content 基类集的 app_label 来实现这一点的任何想法?

4

1 回答 1

1

文档

如果模型存在于标准 models.py 之外(例如,如果应用程序的模型在 myapp.models 的子模块中),则模型必须定义它属于哪个应用程序:

app_label = 'myapp'

content_block应用程序存在吗?如果没有,我不确定它会起作用。

看来您想要做的是强制表名。这个楼盘有可能

用于模型的数据库表的名称:

db_table = '音乐专辑'

于 2011-01-25T09:29:39.443 回答