我有一个带有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)
提前致谢
答案 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)
__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