有没有人知道我可以排序(在这个实例的日期)我的Django查询设置今天的日期?如何根据今天的日期对我的Django查询集进行排序?
class Person(models.Model):
name = models.CharField(max_length=50)
date = models.DateField()
我的目标是列出名称和日期条目。列表顶部将是与当前日期(日/月)最接近的日期的条目。
有没有人知道我可以排序(在这个实例的日期)我的Django查询设置今天的日期?如何根据今天的日期对我的Django查询集进行排序?
class Person(models.Model):
name = models.CharField(max_length=50)
date = models.DateField()
我的目标是列出名称和日期条目。列表顶部将是与当前日期(日/月)最接近的日期的条目。
您可以使用extra查询集的方法来选择从数据库表中的其他数据。
这个例子与MySQL的工作原理:
Person.objects.extra(select={
'datediff': 'ABS(DATEDIFF(date, NOW()))'}).order_by('datediff')
DATEDIFF - 返回天差bewteen两个日期, 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')
谢谢,我认为这将工作,如果我可以执行此查询,但没有一年,即最近的日期/月份到当前日期。 – felix001 2013-04-14 17:01:47
你是什么意思,但“没有这一年” - 你的意思是04-15-1999会在04-01-2013之前(假设当前日期是04-15-2013) – bmihelac 2013-04-15 07:01:43
所以如果你有12 -4-1980和1-4-1991,日期是9-4-2013,然后12-4-1980会排在第一位。即我只想使用月份和日期对日期进行排序,因为每个日期都将用作生日日期。所以我想看看最近的生日。 – felix001 2013-04-15 10:03:12
如果您想根据日期进行排序,您可以在结果查询集上订购为:.order_by('date')
。
我不确定这是否回答你的问题。在你的意思是你想只选择今天的日期的人的情况下,你可以使用:
import datetime
now = datetime.datetime.now()
persons_with_date_today = Person.objects.filter(date=now)
“排序”是什么意思?您可以使用普通的'.order_by('date')'按日期排序。 – 2013-04-09 20:26:04
@PavelAnossov我猜他的意思是'[今天,2天前,3天以后,4天前,...]' - 相对于今天的排序 – karthikr 2013-04-09 20:37:41
你能否提供样本输出 – catherine 2013-04-12 07:26:54