【问题标题】:Django - Models.DateTimeField - Changing dynamically auto_now_add valueDjango - Models.DateTimeField - 动态更改 auto_now_add 值
【发布时间】:2017-02-14 10:50:16
【问题描述】:

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

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

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

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

我不想要:-)

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

提前致谢

【问题讨论】:

  • 我认为您可以在创建数据时显式传递 date_created 值,而 auto_now_add 将被忽略。如果您希望该列为NULL,您可以传递None
  • 为什么不 default=timezone.now?

标签: django django-models


【解决方案1】:

嗯,我花了今天下午才发现,第一个问题是如何获取模型对象以及在代码中的位置。我在 serializer.py 的 restframework 中,例如在序列化器的__init__ 中它还没有 Model 。现在在 to_internal_value 中,您可以获取模型类,在获取字段并修改字段属性后,如下例所示:

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

【讨论】:

    【解决方案2】:

    通过从 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2017-06-23
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多