我需要在多个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()遗憾地只支持查询单个字段。
编辑:我正在寻找一个查询解决方案,如果存在的话。
答案 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