Django:在models.py之外声明基本模型时出现app_label问题

时间:2011-01-25 09:08:08

标签: django inheritance django-syncdb

我有一个抽象的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获取内容基类集的任何想法?

1 个答案:

答案 0 :(得分:1)

来自the doc

  

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

app_label = 'myapp'

content_block申请是否存在?如果没有,我不会感到它会起作用。

似乎你要做的就是强制表名。这个属性可能会

  

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

     

db_table ='music_album'