【问题标题】:Django DateTimeRangeField: default=[timezone.now()]-[timezone.now()]+[10YEARS]Django DateTime RangeField:默认=[timezone.now()]-[timezone.now()]+[10 YEARS]
【发布时间】:2021-01-29 09:02:30
【问题描述】:

我想要一个“active_in”属性作为时间范围。我假设 DBMS 针对 postgresql tsrange 字段进行了优化,因此最好使用 DateTimeRangeField 而不是 start_date 和 end_date 的 2 个单独字段。

这样做我希望该字段有一个默认值。

active_in = models.DateTimeRangeField(default=timezone.now+'-'+timezone.now+10YEARS)
  • 我对 DateTimeRangeField 性能的假设是否属实?
  • 是否有一个聪明的解决方案是创建一个新的;函数、类或 只是操纵倒数第二位?

我可能的解决方案:

使用字符串操作的代码:

active_in = models.DateTimeRangeField(default=timezone.now+'-'+timezone.now[:-2]+'30')

使用自定义函数对象的代码:(从这里调整:https://stackoverflow.com/a/27491426/7458018

def today_years_ahead():
    return timezone.now + '-' timezone.now() + timezone.timedelta(years=10)

class MyModel(models.Model):
    ...
    active_in = models.DateTimeRangeField(default=today_years_ahead)

【问题讨论】:

    标签: django postgresql django-models


    【解决方案1】:

    不需要字符串操作,因为该字段的documented Python 类型是DateTimeTZRange

    我不能说我以前曾经使用过这个字段,但是这样的东西应该可以工作:

    from psycopg2.extras import DateTimeTZRange
    from django.utils import timezone
    from datetime import timedelta
    
    def next_ten_years():
        now = timezone.now()
    
        # use a more accurate version of "10 years" if you need it
        return DateTimeTZRange(now, now + timedelta(days=3652))
    
    class MyModel(models.Model):
        ...
        active_in = models.DateTimeRangeField(default=next_ten_years)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多