Django:如何在模型字段的默认属性中使用数据库参数?

时间:2018-01-17 08:59:13

标签: python django

我创建了一种(种类)单例来将所有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模型。

你会如何解决这个问题? 有没有办法“延迟”对默认字段的评估?

感谢。

修改 发布之后,我认为如果我的代码在导入时处理数据库查询,那么它可能有问题......

1 个答案:

答案 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,
    )