Сортировка 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 в базу данных, иначе у вас возникнут проблемы с памятью.