我有一个抽象的Container类,它允许派生模型保存一些内容块,如图像,文本等,它们也是单独的模型。对于db整洁,我希望将这些模型的表标记为content_block_image,content_block_text等。
但是当我在Meta类的Content模型中指定app_label = 'content_block'
时,我在syncdb期间收到错误:
content.event:'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_label
syncdb运行没有问题。似乎app_label不仅仅是一个标签。
有关如何使用app_label获取内容基类集的任何想法?
答案 0 :(得分:1)
来自the doc
如果模型存在于标准models.py之外(例如,如果应用程序的模型位于myapp.models的子模块中),则模型必须定义它所属的应用程序:
app_label = 'myapp'
content_block
申请是否存在?如果没有,我不会感到它会起作用。
似乎你要做的就是强制表名。这个属性可能会
用于模型的数据库表的名称:
db_table ='music_album'