Można użyć extra metodę queryset aby wybrać dodatkowe dane z tabeli bazy danych.
To jest przykład, który współpracuje z MySQL:
Person.objects.extra(select={
'datediff': 'ABS(DATEDIFF(date, NOW()))'}).order_by('datediff')
DateDiff - zwraca różnicę w dniach bewteen dwiema datami, ABS - zwraca wartość bezwzględną. W przypadku sqlite istnieje inna składnia, zobacz tę answer.
EDIT: zużywają prąd roku
Person.objects.extra(select={
'datediff': "ABS(DATEDIFF(CONCAT(YEAR(now()), '-', MONTH(date), '-', DAY(date)), NOW()))"}
).order_by('datediff')
EDIT 2: zoptymalizowany *
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')
EDIT 3: najbliższa data po podano (dzisiejsza) data
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')
Co oznacza "sortować przeciwko"? Możesz sortować według daty ze zwykłym '.order_by ('date')'. –
@PavelAnossov Chyba ma na myśli '[dzisiaj, 2 dni temu, 3 dni w przyszłości, 4 dni temu, ...]' - sortować względem dzisiejszego – karthikr
czy możesz podać przykładowe wyjście? – catherine