def get_field(self, argss, mapping): if 'sort' not in argss: return ['id'] order = argss["sort"] if order and order['prop'] == 'jobid': sql = Case( When(Q(jobid=''), then=-1), default=Cast('jobid', IntegerField()) ) return [sql.asc() if order['order'] == 'ascending' else sql.desc()] else: return [ ('' if order['order'] == 'ascending' else '-') + mapping[order['prop']] if argss['sort'] is not None else 'id' ]
def reorder(_default=AFTER, _reverse=False, **kwargs): """ Return a database expression that can be used in an order_by() so that the queryset will be sorted according to the order of values given. """ if not 0 < len(kwargs) <= 1: raise TypeError("reorder() takes one non-optional keyword argument") fieldname, new_order = kwargs.popitem() if _default is BEFORE: _default = -1 elif _default is AFTER: _default = len(new_order) whens = [When(**{fieldname: v, 'then': i}) for i, v in enumerate(new_order)] casewhen = Case(*whens, default=Value(_default), output_field=IntegerField()) if _reverse: return casewhen.desc() else: return casewhen.asc()