在新版本的Django中,DateModifierNode的替代品是什么

Cho*_*abu 4 python django orm django-models django-orm

我想基于模型的两个字段进行查询,日期,偏移量为int,用作timedelta

model.objects.filter(last_date__gte=datetime.now()-timedelta(days=F('interval')))
Run Code Online (Sandbox Code Playgroud)

是一个禁忌,因为F()表达式不能传递给timedelta

一点点挖掘,我发现DateModifierNode- 尽管它似乎在这个提交中删除了:https://github.com/django/django/commit/cbb5cdd155668ba771cad6b975676d3b20fed37b(来自这个现在过时的SO问题Django:在datetime.timedelta中使用F参数在查询中)

提交提到:

.dates()查询是使用自定义Query,QuerySet和Compiler类实现的.而是使用表达式和数据库转换器API实现它们.

这听起来很明智,就像应该有一个快速简单的方法 - 但我已经无果而终地寻找如何做太久的事情 - 任何人都知道答案?

Cho*_*abu 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()))
Run Code Online (Sandbox Code Playgroud)

这应该使我的原始查询看起来像

model.objects.annotate(new_date=ExpressionWrapper(F('last_date') + F('interval'), output_field=DateTimeField())).filter(new_date__gte=datetime.now())
Run Code Online (Sandbox Code Playgroud)

  • `F('last_date') + F('interval')` 真的有可能并且输出是日期时间字段吗?并且它以与`timedelta(days=interval)`相同的天数增加? (2认同)

小智 5

在 Django 1.10 中有更简单的方法来做到这一点,但你需要稍微改变模型:使用 DurationField。我的模型如下:

class MyModel(models.Model):

    timeout = models.DurationField(default=86400 * 7)  # default: week
    last = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

查找减号last之前的对象的查询是:nowtimeout

MyModel.objects.filter(last__lt=datetime.datetime.now()-F('timeout'))
Run Code Online (Sandbox Code Playgroud)