django 查询多个日期中的最新日期
django query latest of multiple dates
我需要在多个 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() 可惜只支持查询单个字段。
编辑:我正在寻找一个单一查询的解决方案,如果它存在的话。
你可以用两个查询来完成。一份用于 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
对于单查询解决方案,您可以使用 django 的 extra() 查询集方法:
latest_obj = Presentaion.objects.extra({"latest_date":"greatest(start, end)"}).order_by('latest_date')[0]
这将为您提供具有最新时间戳的对象。 latest_obj
现在有一个额外的属性 latest_date
latest_obj.latest_date
编辑:
不推荐使用 extra()
,在未来的版本中将被弃用。
Use this method as a last resort. This is an old API that we aim to deprecate at some point in the future. Use it only if you cannot express your query using other queryset methods.
在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]
我需要在多个 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() 可惜只支持查询单个字段。
编辑:我正在寻找一个单一查询的解决方案,如果它存在的话。
你可以用两个查询来完成。一份用于 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
对于单查询解决方案,您可以使用 django 的 extra() 查询集方法:
latest_obj = Presentaion.objects.extra({"latest_date":"greatest(start, end)"}).order_by('latest_date')[0]
这将为您提供具有最新时间戳的对象。 latest_obj
现在有一个额外的属性 latest_date
latest_obj.latest_date
编辑:
不推荐使用 extra()
,在未来的版本中将被弃用。
Use this method as a last resort. This is an old API that we aim to deprecate at some point in the future. Use it only if you cannot express your query using other queryset methods.
在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]