我在djangos syncdb机制中发现了一个有趣的行为,因为我上次尝试将数据库同步到新的部署。
我有两个应用alphabet
和core
,其中核心存储了我的大多数模型。
现在我用字母表创建了一个新的抽象模型,其代码如下:
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)
答案 0 :(得分:0)
在字段定义中调用count()
不正确。 Django尝试在加载模型时评估查询。在您的情况下,这是在创建表之前。即使创建了表,查询也只会在每次加载模块时评估一次,并且在创建和删除实例时不会更新。
您可以将callable传递给模型字段作为默认值,因此您可以尝试
speakers = IntegerField(default=Speaker.objects.count)
然后在创建模型实例时评估查询。