Сортировка Django QuerySet по результату вызова метода

Сортировка Django QuerySet по результату вызова метода

Скажем, у меня есть запрос, над которым работал Билл:

test=MyModel.objects.filter(user='Bill')

Теперь я хочу отсортировать все эти вещи по дате, когда они были назначены для выставления счета. К сожалению, дата назначения не является полем в модели MyModel. Вместо этого есть метод с именем invoice_date(), который вычисляет это и возвращает дату. Например, следующее:

MyModel.invoice_date()

Я составил запрос что-то вроде этого:

test=MyModel.objects.filter(user='Bill').order_by(self__invoice_date ())

Я знаю, что это не сработает. Есть другой способ?

Ответ

Если invoice_date () - это функция Python, вы не можете заставить базу данных сортировать по ней. Вам нужно будет отсортировать результаты после того, как вы загрузите их в память. Это нормально, если полученный результат не содержит большой объем данных.

unsorted_qs = MyModel.objects.filter(user='Bill')
sorted_results = sorted(unsorted_qs , key= lambda t: t.invoice_date())  # возвращает отсортированный список из объектов MyModel

Если запрос возвращает большое количество объектов, то вам нужно придумать какой-нибудь способ добавить invoice_date в базу данных, иначе у вас возникнут проблемы с памятью.