小编kei*_*thb的帖子

使用查询数据库的默认字段函数迁移时出现 Django 错误

我正在尝试创建一个可调用的默认字段,如下所示:

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 块中,但数据库最终处于回滚状态,我无法继续。

其他位:

  • 我正在使用 Django 1.8
  • 在我的实际应用程序中,该类Preferences实际上是使用 django-solo 的数据库单例。

更新:澄清操作顺序

以下是正在发生的事情的时间表:

  1. preferences/migrations/initial_0001.py:初始偏好,包括expiration_days
  2. business/migrations/initial_0001.py:初始业务对象,取决于 …

python django django-models django-migrations

5
推荐指数
1
解决办法
1854
查看次数

标签 统计

django ×1

django-migrations ×1

django-models ×1

python ×1