Django syncdb在抽象模型中失败并带有循环引用

时间:2015-10-07 10:27:30

标签: python django

我在djangos syncdb机制中发现了一个有趣的行为,因为我上次尝试将数据库同步到新的部署。

我有两个应用alphabetcore,其中核心存储了我的大多数模型。 现在我用字母表创建了一个新的抽象模型,其代码如下:

class Compare(models.Model):
    percentage = FloatField(default=0)
    speakers = IntegerField(default=Speaker.objects.count())

    class Meta:
         abstract = True

和核心应用程序中的引用模型:

class Speaker(models.Model):
    language = CharField(max_length=300)

当我尝试使用syncdb命令同步数据库时,它失败了ProgrammingError,因为表core.speaker不存在。

为什么syncdb甚至检查抽象模型?如何在项目中解决此循环引用?

(我顺便使用Django 1.6)

1 个答案:

答案 0 :(得分:0)

在字段定义中调用count()不正确。 Django尝试在加载模型时评估查询。在您的情况下,这是在创建表之前。即使创建了表,查询也只会在每次加载模块时评估一次,并且在创建和删除实例时不会更新。

您可以将callable传递给模型字段作为默认值,因此您可以尝试

speakers = IntegerField(default=Speaker.objects.count)

然后在创建模型实例时评估查询。