如何根据今天的日期对Django查询集进行排序?

时间:2013-04-09 20:24:38

标签: django

是否有人知道我如何排序(在此实例日期)我的django查询设置与今天的日期?

class Person(models.Model):
    name = models.CharField(max_length=50)
    date = models.DateField()

我的目标是列出名称和日期条目。列表顶部将是日期最接近今天日期(日/月)的条目。

2 个答案:

答案 0 :(得分:6)

您可以使用extra queryset方法从数据库表中选择其他数据。

这是适用于MySql的示例:

Person.objects.extra(select={
    'datediff': 'ABS(DATEDIFF(date, NOW()))'}).order_by('datediff')

DATEDIFF - 返回两个日期之间的天数差异, ABS - 返回绝对值。对于sqlite,有不同的语法,请参阅此answer

编辑:使用当前年度

Person.objects.extra(select={
    'datediff': "ABS(DATEDIFF(CONCAT(YEAR(now()), '-', MONTH(date), '-', DAY(date)), NOW()))"}
).order_by('datediff')

编辑2:优化*

from datetime import date
dayofyear = int(date.today().strftime("%j"))

datediff = 'LEAST(ABS(DAYOFYEAR(date) - %d), ABS((366 - %d + DAYOFYEAR(date))) MOD 366)' % (
      dayofyear, dayofyear
    )
Person.objects.extra(select={'datediff': datediff}).order_by('datediff')

编辑3:给定(今天)日期之后的最近日期

    from datetime import date
    dayofyear = int(date.today().strftime("%j"))

    datediff = '(DAYOFYEAR(date) - %d + 365) MOD 365' % (
          dayofyear
        )
    Persion.objects.extra(select={'datediff': datediff}).order_by('datediff')

答案 1 :(得分:0)

如果您想根据日期排序,可以在结果查询集上订购:.order_by('date')

我不确定这是否能回答你的问题。如果您的意思是只想选择今天日期的人,您可以使用:

import datetime
now = datetime.datetime.now()
persons_with_date_today = Person.objects.filter(date=now)