Сортировка набора QuerySet Django с помощью свойства (а не поля) модели

Некоторый код и моя цель

Моя (упрощенная) модель:

class Stop(models.Model): EXPRESS_STOP = 0 LOCAL_STOP = 1 STOP_TYPES = ( (EXPRESS_STOP, 'Express stop'), (LOCAL_STOP, 'Local stop'), ) name = models.CharField(max_length=32) type = models.PositiveSmallIntegerField(choices=STOP_TYPES) price = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) def _get_cost(self): if self.price == 0: return 0 elif self.type == self.EXPRESS_STOP: return self.price / 2 elif self.type == self.LOCAL_STOP: return self.price * 2 else: return self.price cost = property(_get_cost) 

Моя цель : я хочу сортировать по cost собственности. Я попробовал два подхода.

Использование order_by QuerySet API

 Stops.objects.order_by('cost') 

Это дало следующую ошибку шаблона:

 Caught FieldError while rendering: Cannot resolve keyword 'cost' into field. 

Использование фильтра шаблонов dictsort

 {% with deal_items|dictsort:"cost_estimate" as items_sorted_by_price %} 

Получена следующая ошибка шаблона:

 Caught VariableDoesNotExist while rendering: Failed lookup for key [cost] in u'Union Square' 

Так…

Как мне это сделать?

Используйте QuerySet.extra() вместе с CASE ... END для определения нового поля и сортировки по нему.

 Stops.objects.extra(select={'cost': 'CASE WHEN price=0 THEN 0 ' 'WHEN type=:EXPRESS_STOP THEN price/2 WHEN type=:LOCAL_STOP THEN price*2'}, order_by=['cost']) 

Это или отбросить QuerySet возвращенный из остального, в список, а затем использовать L.sort(key=operator.attrgetter('cost')) на нем.