我想基于模型的两个字段进行查询,日期,偏移量为int,用作timedelta
model.objects.filter(last_date__gte=datetime.now()-timedelta(days=F('interval')))
是禁止的,因为F()表达式不能传递给timedelta
有点挖掘,我发现DateModifierNode
- 虽然它似乎已在此提交中删除:https://github.com/django/django/commit/cbb5cdd155668ba771cad6b975676d3b20fed37b(来自这个现已过时的SO问题Django: Using F arguments in datetime.timedelta inside a query)
提交提及:
.dates()查询是使用自定义Query,QuerySet实现的, 和编译器类。而是通过使用表达式和实现它们 数据库转换器API。
这听起来很明智,就像应该有一个快速简单的方法 - 但是我已经无果而终地寻找如何做这件事太久了 - 有谁知道答案?
答案 0 :(得分:5)
啊,回答文档:https://docs.djangoproject.com/en/1.9/ref/models/expressions/#using-f-with-annotations
from django.db.models import DateTimeField, ExpressionWrapper, F
Ticket.objects.annotate(
expires=ExpressionWrapper(
F('active_at') + F('duration'), output_field=DateTimeField()))
应该使我的原始查询看起来像
model.objects.annotate(new_date=ExpressionWrapper(F('last_date') + F('interval'), output_field=DateTimeField())).filter(new_date__gte=datetime.now())
答案 1 :(得分:3)
在Django 1.10中,有更简单的方法可以做到这一点,但你需要稍微改变模型:使用DurationField。我的模型如下:
class MyModel(models.Model):
timeout = models.DurationField(default=86400 * 7) # default: week
last = models.DateTimeField(auto_now_add=True)
以及在last
减去now
之前查找timeout
所在对象的查询是:
MyModel.objects.filter(last__lt=datetime.datetime.now()-F('timeout'))