Похоже, due_date_cmp
сортирует список, состоящий из datetime.date
и None
объектов, помещая None
s в конец списка.
Вы можете сделать то же самое, используя клавишукоторый преобразует None
объектов в максимально возможный datetime.date
объект:
старый способ (с использованием cmp):
import datetime as dt
def due_date_cmp(t1, t2):
if t1 == None and t2 == None:
return 0;
if t1 == None:
return 1
if t2 == None:
return -1
return (t1 - t2).days
dates=[dt.date(2000,1,1),None,dt.date(1999,1,1),None,dt.date(2002,1,1)]
dates.sort(cmp=due_date_cmp)
print(dates)
# [datetime.date(1999, 1, 1), datetime.date(2000, 1, 1), datetime.date(2002, 1, 1), None, None]
новый способ (с использованиемключ):
def due_date_key(t):
if t is None:
return dt.date(dt.MAXYEAR,12,31)
else:
return t
dates=[dt.date(2000,1,1),None,dt.date(1999,1,1),None,dt.date(2002,1,1)]
dates.sort(key=due_date_key)
print(dates)
# [datetime.date(1999, 1, 1), datetime.date(2000, 1, 1), datetime.date(2002, 1, 1), None, None]
Таким образом, вы можете использовать due_date_key
в своем коде так:
import operator
class Task(models.Model):
@property
def due_date_key(self):
due_date=self.due_date
if due_date is None:
return dt.date(dt.MAXYEAR,12,31)
else:
return due_date
tasks = Task.objects.all()
tasks.sort(key=operator.attrgetter('due_date_key'))