我创建了一种(种类)单例来将所有app参数放在我的数据库中:
class SingletonModel(models.Model):
def save(self, *args, **kwargs):
self.pk = 1
super(SingletonModel, self).save(*args, **kwargs)
@classmethod
def load(cls):
return cls.objects.all().get()
class Meta:
abstract = True
class AppParameters(SingletonModel, models.Model):
DEFAULT_BALANCE_ALERT_THRESHOLD = models.PositiveIntegerField(default=5)
# other parameters...
它工作得很好,直到我尝试在模型字段的default
属性中使用其中一个参数:
class Convive(models.Model):
balance_alert_threshold = models.IntegerField(
default=AppParameters.load().DEFAULT_BALANCE_ALERT_THRESHOLD,
blank=True,
null=True)
这似乎也有效,但当我使用脚本重新初始化本地数据时,第一个manage.py migrate
产生DoesNotExist
,因为我的Singleton尚不存在。
这是因为文件导入Convive
模型。
你会如何解决这个问题? 有没有办法“延迟”对默认字段的评估?
感谢。
修改 发布之后,我认为如果我的代码在导入时处理数据库查询,那么它可能有问题......
答案 0 :(得分:1)
创建一个返回默认值
的方法def get_default_balance_alert_threshold():
return AppParameters.load().DEFAULT_BALANCE_ALERT_THRESHOLD
然后使用该方法作为默认方法。
class Convive(models.Model):
balance_alert_threshold = models.IntegerField(
default=get_default_balance_alert_threshold,
blank=True,
null=True,
)