Я думаю, вам нужно сделать свой метод due_date методом c или отделить его от модели, метод получает объект и возвращает дату, а затем использовать этот метод в отсортированном методе. Примерно так
def due_date(obj):
today = timezone.localtime(timezone.now()).date()
if obj.date < today:
return today
else:
return obj.date
qs = sorted(Pm.objects.all(), key=due_date, reverse=True)
Если вы сделаете этот метод stati c в классе Model, то используйте его как:
qs = sorted(Pm.objects.all(), key=PM.due_date, reverse=True)
В противном случае вам нужно аннотировать, а затем использовать order_by of набор запросов. аннотация с условными выражениями F-выражения
что-то вроде этого (это может быть не точное решение, но вам нужно сделать что-то вроде этого):
from django.db.models import Case, DateField, Value, When
qs = Pm.objects.annotate(
due_date=Case(
When(date__lt=today, then=Value(today)),
default=F("date"),
output_field=DateField(),
)
)
qs.order_by("due_date")