【问题标题】:Django: durationField default valueDjango:durationField默认值
【发布时间】:2015-06-24 08:14:39
【问题描述】:

Django的DurationField的正确使用方法是什么?

当我使用time_passed = models.DurationField(default=0):

  • 迁移工作
  • 表单默认设置不起作用 ('int' object has no attribute 'total_seconds')

当我使用time_passed = models.DurationField(default=timedelta()):

  • 迁移不起作用 (ValueError: Cannot serialize: datetime.timedelta(0))
  • 表单默认工作

那么在持续时间字段上使用默认值的正确方法是什么?或者解决这个问题的方法是什么?

【问题讨论】:

  • @EllaShar...你刚刚链接到这个确切的问题
  • @rnevius 哎呀,已编辑。
  • @EllaShar 我知道,但这个问题从未得到答案(有目的的答案也不起作用)。我也无法对此发表评论。
  • 这看起来像一个错误,你应该报告它。 django.db.migrations.writer.MigrationWriter.serialize 有一堆针对不同数据类型的特殊情况,特别是日期、日期时间和时间,所以看起来timedelta 也应该在那里。作为一种解决方法,您可以尝试创建DurationField 的子类并实现deconstruct() method ...这已经是在 Django 的EmailFieldIPAddressField 和其他一些中完成的方式

标签: python django django-models django-forms django-1.8


【解决方案1】:

默认值应该是时间增量。这是 Django 中的一个错误,将在 1.8.1 版本中修复。

见:https://code.djangoproject.com/ticket/24566

所以使用默认应该是: time_passed = models.DurationField(default=timedelta())

【讨论】:

  • 您不想在这里创建 timedelta 对象的(可变)实例,您只想引用该类。所以不是models.DurationField(default=timedelta()),而是models.DurationField(default=timedelta)。见:docs.djangoproject.com/en/dev/ref/models/fields/#default
  • @TroyGrosfield 你的建议到底应该达到什么目的?如果我们不提供参数,如何分配 timedelta 在创建时填充所需的值?
  • @DarkFranX 如果你调用 use timedelta() 它会立即执行并给你一个值。如果您提供函数“timedelta”(没有括号),它会知道它是一个函数并在需要时调用它,这将为您提供一个新的对象实例。有关更多解释,请参阅上面提供的 django 文档。
  • @TroyGrosfield 在这种情况下传递给timedelta 的参数是什么?
  • 其实@TroyGrosfield 的评论是正确的答案,MatZeg 的答案是不正确的。
【解决方案2】:

MatZeg 的 answer on this similar question 表明您仍然可以传入参数:

pause = DurationField(default=timedelta(minutes=20))

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2015-05-22
    • 1970-01-01
    • 2019-07-05
    • 2010-12-05
    • 2012-03-17
    • 2012-07-13
    • 2013-09-24
    • 2021-10-05
    相关资源
    最近更新 更多