Django - Models.DateTimeField - 动态更改auto_now_add值

时间:2016-10-05 20:45:37

标签: django django-models

我有一个带有DateTimeField的Django模型,其中auto_now_add设置为True。这很有效。

class Problem(models.Model):
    ...
    date_created = models.DateTimeField('created on', auto_now_add=True)

我希望,当我创建测试数据或加载历史数据时,绕过此参数(auto_now_add设置为False)以设置我想要的日期并切换回< / strong>到标准行为(auto_now_add设置为True)。

有没有办法动态更改类(通过更改类的属性?)。此参数对数据库没有影响,可能在保存阶段触发。

我不想要: - )

date_created = models.DateTimeField('created on', default=timezone.now)

提前致谢

2 个答案:

答案 0 :(得分:0)

通过从shell命令执行的数据导入脚本从另一个应用程序导入数据时遇到了类似的问题。 由于无法动态禁用auto_now_add或auto_now功能,因此我不得不使用修改后的设置模块。

首先,在原始设置模块中定义了一个IMPORT变量:

IMPORT = False

并创建了一个仅包含:

的新import_settings模块
from my_app.settings import *
IMPORT = True

然后,在定义我的模型时,我添加了代码

from django.conf import settings
if settings.IMPORT:
    AUTO_NOW = False
else:
    AUTO_NOW = True

并在配置DateTimeField

时使用AUTO_NOW的值
created = models.DateTimeField(editable=False, null=True, blank=True, auto_now_add=AUTO_NOW)
modified = models.DateTimeField(editable=False, null=True, blank=True, auto_now=AUTO_NOW)

最后,我使用manage命令的--settings选项启动了数据导入脚本:

python manage.py shell --settings=my_app.import_settings

答案 1 :(得分:0)

嗯,我今天下午花了很多时间找出来,第一个问题是如何获取模型对象以及代码中的位置。我在serializer.py中的restframework中,例如在__init__的序列化程序中,它还没有模型。现在在to_internal_value中,您可以在获取Field之后获取模型类,然后修改字段属性,如下例所示:

class ProblemSerializer(serializers.ModelSerializer):

    def to_internal_value(self, data): 
        ModelClass = self.Meta.model
        dfil = ModelClass._meta.get_field('date_update')
        dfil.auto_now = False
        dfil.editable = True