Sorting a Django QuerySet by a property (not a field) of the Model

Use QuerySet.extra() along with CASE ... END to define a new field, and sort on that.

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'},

That, or cast the QuerySet returned from the rest to a list, then use L.sort(key=operator.attrgetter('cost')) on it.

Leave a Comment