Django DateTimeRangeField:默认=[timezone.now()]-[timezone.now()]+[10YEARS]

LeO*_*low 4 django postgresql django-models

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

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

active_in = models.DateTimeRangeField(default=timezone.now+'-'+timezone.now+10YEARS)
Run Code Online (Sandbox Code Playgroud)
  • 我对 DateTimeRangeField 性能的假设是否正确?
  • 是否有一个聪明的解决方案可以创建一个新的;函数、类或简单地操作倒数第二个数字?

我可能的解决方案:

使用字符串操作的代码:

active_in = models.DateTimeRangeField(default=timezone.now+'-'+timezone.now[:-2]+'30')
Run Code Online (Sandbox Code Playgroud)

使用自定义函数对象的代码:(从此处调整: 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)
Run Code Online (Sandbox Code Playgroud)

Kev*_*nry 5

不需要字符串操作,因为该字段的记录DateTimeTZRangePython 类型是.

我不能说我以前用过这个字段,但这样的东西应该有效:

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)
Run Code Online (Sandbox Code Playgroud)