Сортировка набора 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' 

Так…

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

One Solution collect form web for “Сортировка набора QuerySet Django с помощью свойства (а не поля) модели”

Используйте 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')) на нем.

  • Изменение ширины элементов формы, созданных с помощью ModelForm в Django
  • Как использовать iframes в django-cms
  • Как правильно получить URL-адрес для входа в шаблон?
  • Существует ли реализация HAML для использования с Python и Django
  • Доступ к dict по переменной в шаблонах Django?
  • Как я могу связать forloop.counter с строкой в ​​моем шаблоне django?
  • Сравнение тегов js и template
  • Показать профиль pic из модели в шаблоне в django
  • Python - лучший язык программирования в мире.