我正在尝试创建一个可调用的默认字段,如下所示:
from datetime import date, timedelta
from django.db import models
class Preferences(models.Model):
expiration_days = models.IntegerField(default=30)
... other db settings here ...
class ImportantBusinessObject(models.Model):
expiration_date = models.DateField(default=get_default_expiration_date)
def get_default_expiration_date():
expiration_days = Preferences.objects.first().expiration_days
return date.today() + timedelta(days=expiration_days)
Run Code Online (Sandbox Code Playgroud)
这个想法是,数据库中存储了一组全局首选项,这些首选项会影响其他模型对象的默认值。
一切都很好,直到需要向Preferences
类中添加另一个字段为止。然后,在构建数据库时(例如,在运行测试时),添加该expiration_date
字段的迁移最终会在添加另一个首选项字段的新迁移之前执行。在调用期间get_default_expiration_date()
,Preferences 对象是最新版本,但数据库尚未获得最新的迁移,并且出现错误column preferences.new_preference does not exist
。
解决这个问题的最佳方法是什么?
现在,我在测试期间禁用迁移作为解决方法,但我想知道是否还有其他方法。
我尝试从应用程序注册表中获取模型get_default_expiration_date()
,但它仍然是最新的模型,而不是您在函数中给出的版本模型migrations.RunPython
。
我还尝试将获取对象的行包装Preferences
在 try/ except 块中,但数据库最终处于回滚状态,我无法继续。
其他位:
Preferences
实际上是使用 django-solo 的数据库单例。更新:澄清操作顺序
以下是正在发生的事情的时间表:
preferences/migrations/initial_0001.py
:初始偏好,包括expiration_days
business/migrations/initial_0001.py
:初始业务对象,取决于 …