两个字段之间的Timedelta

时间:2016-10-11 20:21:49

标签: django django-orm

我正在寻找两个字段之间的timedelta大于特定天数的对象。

Baiscally我有一个发送信件的日期,以及收到批准的日期。如果在30天内没有收到批准,那么这些对象应该包含在查询集中。

我可以做类似下面的事情,其中​​delta是静态的。 但是我不需要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)

任何指针如何做到这一点?

2 个答案:

答案 0 :(得分:9)

听起来好像要使用F对象进行注释。像这样:

from django.db.models import DateTimeField, ExpressionWrapper, F

delta = datetime.timedelta(days=30)
expression = F('approval_from') - F('letter_sent')
wrapped_expression = ExpressionWrapper(expression, DateTimeField())
qs = qs.objects.annotate(delta=wrapped_expression)
qs = qs.filter(delta__gte=delta)

答案 1 :(得分:0)

您也可以采用其他方法。只需将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)