【问题标题】:django models DateTimeField(default=next 3-days)django 模型 DateTimeField(default=next 3-days)
【发布时间】:2017-12-19 14:22:49
【问题描述】:

models.py

class TestModel(models.Model):
      event = models.DateTimeField(default=next 3-days) 

如何获得未来 3 天的默认值? 有可能吗?

【问题讨论】:

  • “接下来的 3 天”是什么意思?这是一个期间,而不是日期时间
  • 是期间,下 3 期间
  • 你的意思是从今天开始 3 天内?
  • 但它是默认的,而不是范围。你不能说“我们的会议是在接下来的 3 天”...
  • 不,我可以说'我们的会议后 3 天'

标签: python django django-models


【解决方案1】:

您应该使用返回所需日期时间的可调用对象,例如:

from datetime import timedelta
from django.utils import timezone

def in_three_days():
    return timezone.now() + timedelta(days=3)

class TestModel(models.Model):
      event = models.DateTimeField(default=in_three_days)

如果您在 Vaibhav 的回答中使用 x = datetime.datetime.now() + datetime.timedelta(days = 3),则将在加载模块时计算 x,而不是在创建每个新的 TestModel 实例时计算。

【讨论】:

  • 这个想法是正确的,但是,在函数“in_three_days”中,您使用 datetime.now(),它不知道时区,可能会导致问题
  • @GiorgiJambazishvili 好点,我已经更新了代码以使用timezone.now()
【解决方案2】:

这是一种方法。

import datetime
class TestModel(models.Model):
      x = datetime.datetime.now() + datetime.timedelta(days = 3)
      event = models.DateTimeField(default = x) 

【讨论】:

  • 这将在服务器加载时计算一次x。您应该使用返回日期时间的可调用对象。
  • 我没听懂.. 你的意思是说定义一个返回x 的短函数会更好??如何??你能解释一下吗?
【解决方案3】:

正如一些答案所指出的,您必须使用可调用对象,但您还应该包含时区感知日期时间对象以正确设置接下来的 3 天,这将按预期工作,并且不会给您依赖服务器时间的时区不感知日期时间对象

from django.utils import timezone as tz

def next_day_dt(n=3):
    return tz.localtime(tz.now()) + tz.timedelta(days=n)

class TestModel(models.Model):
    event = models.DateTimeField(default=next_day_dt)
...

希望对你有帮助

【讨论】:

    【解决方案4】:

    我想这是迄今为止最好的解决方案:

    from datetime import datetime, timedelta
    
    class MyModel(models.Model):
       mydate = models.DateTimeField(default=datetime.now()+timedelta(days=3))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2019-06-13
      相关资源
      最近更新 更多