【问题标题】:How do I sort my Django Query Set against today date?如何根据今天的日期对我的 Django 查询集进行排序?
【发布时间】:2025-12-19 10:10:17
【问题描述】:

有谁知道我如何根据今天的日期对我的 django 查询集进行排序(在本例中为日期)?

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

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

【问题讨论】:

  • “排序依据”是什么意思?可以用普通的.order_by('date')按日期排序。
  • @PavelAnossov 我猜他的意思是[today, 2 days ago, 3 days in future, 4 days ago, ...] - 相对于今天排序
  • 你能提供一个示例输出吗

标签: django


【解决方案1】:

您可以使用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')

【讨论】:

  • 谢谢,如果我可以执行此查询但没有年份,即与当前日期最近的日/月,我认为这将起作用。
  • “但没有年份”是什么意思 - 你的意思是 04-15-1999 会在 04-01-2013 之前出现(假设当前日期是 04-15-2013。 )
  • 因此,如果您有 12-4-1980 和 1-4-1991 并且日期是 9-4-2013,那么 12-4-1980 将首先出现。即我只想使用月份和日期对日期进行排序,因为每个日期都将用作生日日期。所以我想看看最近的生日。
  • 我已经更新了使用当年的答案。这可以优化。
  • “Edit 2”版本比较的是一年中的几天而不是日期。
【解决方案2】:

如果要根据日期排序,可以在结果查询集上按以下顺序排序:.order_by('date')

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

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

【讨论】:

  • 这是过滤结果,OP需要根据今天的日期对其进行排序
  • 我知道,这也是我的回答——但由于 OP 的措辞含糊不清,我还添加了解释,以防他需要过滤。
  • 问题是,按时间戳相对于现在的差异递增顺序排序
  • 示例[today, 2 days ago, 3 days in future, 4 days ago, ...]
  • 请注意...这不是时区感知的,因此即使您设置了USE_TZ,它也不会使用它。 Django 的django.utils.timezone 有一个now 方法可以识别时区,因此根据您的需要,timezone.now() 可能会更好。
最近更新 更多