两个字段之间的时间差
Timedelta between two fields
我正在寻找两个字段之间的时间差大于特定天数的对象。
Baiscally 我有一个发送信件的日期和一个收到批准的日期。如果在比方说 30 天内没有收到批准,那么这些对象应该包含在查询集中。
我可以做类似下面的事情,其中增量是静态的。
但是我不需要 datetime.date.today()
作为开始,但需要与其他对象进行比较。
delta = datetime.date.today() - datetime.timedelta(30)
return qs.filter(letter_sent__isnull=False)\
.filter(approval_from__isnull=True)\
.filter(letter_sent__gte=delta)
任何指示如何做到这一点?
听起来您想用 F
对象进行注释。像这样:
from django.db.models import DurationField, ExpressionWrapper, F
delta = datetime.timedelta(days=30)
expression = F('approval_from') - F('letter_sent')
wrapped_expression = ExpressionWrapper(expression, DurationField())
qs = qs.annotate(delta=wrapped_expression)
qs = qs.filter(delta__gte=delta)
你也可以反过来。只需将 F("num_days") 放在 timedelta 之外,因为 timedelta 不知道 F().
from datetime import timedelta
expression = F('approval_from') - timedelta(days=1) * F("num_days")
wrapped_expression = ExpressionWrapper(expression, DateTimeField())
qs = qs.annotate(letter_sent_annotation=wrapped_expression)
qs = qs.filter(letter_sent__gte=letter_sent_annotation)
我正在寻找两个字段之间的时间差大于特定天数的对象。
Baiscally 我有一个发送信件的日期和一个收到批准的日期。如果在比方说 30 天内没有收到批准,那么这些对象应该包含在查询集中。
我可以做类似下面的事情,其中增量是静态的。
但是我不需要 datetime.date.today()
作为开始,但需要与其他对象进行比较。
delta = datetime.date.today() - datetime.timedelta(30)
return qs.filter(letter_sent__isnull=False)\
.filter(approval_from__isnull=True)\
.filter(letter_sent__gte=delta)
任何指示如何做到这一点?
听起来您想用 F
对象进行注释。像这样:
from django.db.models import DurationField, ExpressionWrapper, F
delta = datetime.timedelta(days=30)
expression = F('approval_from') - F('letter_sent')
wrapped_expression = ExpressionWrapper(expression, DurationField())
qs = qs.annotate(delta=wrapped_expression)
qs = qs.filter(delta__gte=delta)
你也可以反过来。只需将 F("num_days") 放在 timedelta 之外,因为 timedelta 不知道 F().
from datetime import timedelta
expression = F('approval_from') - timedelta(days=1) * F("num_days")
wrapped_expression = ExpressionWrapper(expression, DateTimeField())
qs = qs.annotate(letter_sent_annotation=wrapped_expression)
qs = qs.filter(letter_sent__gte=letter_sent_annotation)