django查询多个日期的最新信息

时间:2016-03-11 14:52:22

标签: django django-queryset

我需要在多个DateTimeFields中找到最新的日期条目。

models.py:

class Presentation(models.Model):
    start = models.DateTimeField(blank=True, null=True, verbose_name=_(u'Start'))
    end = models.DateTimeField(blank=True, null=True, verbose_name=_(u'End'))

我知道latest()遗憾地只支持查询单个字段。

编辑:我正在寻找一个查询解决方案,如果存在的话。

2 个答案:

答案 0 :(得分:3)

对于一个查询解决方案,您可以使用django的extra() queryset方法:

latest_obj = Presentaion.objects.extra({"latest_date":"greatest(start, end)"}).order_by('latest_date')[0]

这将为您提供具有最新时间戳的对象。 latest_obj现在有一个额外的属性latest_date

latest_obj.latest_date

编辑:

建议不要使用extra(),并且在将来的版本中不推荐使用。

  

使用此方法作为最后的手段。这是一个旧的API,我们打算在将来的某个时候弃用。仅当您无法使用其他查询集方法表达查询时才使用它。

在django1.9中引入了数据库函数Greatest。现在,您可以使用annotate

from django.db.models.functions import Greatest
latest_obj = Presentaion.objects.annotate(last_date=Greatest('start', 'end')).order_by('last_date')[0]

答案 1 :(得分:1)

您可以使用两个查询来执行此操作。一个用于start,另一个用于end

latest_start = Presentaion.objects.latest('start')
latest_end = Presentaion.objects.latest('end')

if latest_start.start > latest_end.end:
    latest_date = latest_start.start
else:
    latest_date = latest_end.end