È possibile utilizzare il metodo extra set di query per selezionare i dati aggiuntivi da tabella di database.
Questo è l'esempio che funziona con MySql:
Person.objects.extra(select={
'datediff': 'ABS(DATEDIFF(date, NOW()))'}).order_by('datediff')
DATEDIFF - restituisce differenza in giorni bewteen due date, ABS - restituisce valore assoluto. Per sqlite, esiste una sintassi diversa, vedere questo answer.
EDIT: usare corso
Person.objects.extra(select={
'datediff': "ABS(DATEDIFF(CONCAT(YEAR(now()), '-', MONTH(date), '-', DAY(date)), NOW()))"}
).order_by('datediff')
EDIT 2: ottimizzato *
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: data più vicina dopo la data (oggi) 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')
Che cosa significa "ordinare contro"? È possibile ordinare per data con ordinario '.order_by ('date')'. –
@PavelAnossov Immagino che intenda '[oggi, 2 giorni fa, 3 giorni in futuro, 4 giorni fa, ...]' - ordinamento relativo a oggi – karthikr
puoi fornire un campione di output – catherine