Django - order_by a queryset using the INT part of a field

Viewed 84

I have this query:

qs = MyObject.objects.all()

In my MyObject model I have case_number field. It's a CharField, the value is a combination of int and string like "123abc".

I want to order my queryset by the int part of case_number field. Example:

['34ohkj', '456kKJj', '12jk'] -> ['12jk', '34ohkj', '456kKJj']

I tried this, but it doesn't work because I can't remove the string part of case_number:

qs.annotate(case_number_int=Cast(F('case_number'), IntegerField())).order_by('case_number_int')

Any help would be appreciated !

1 Answers
qs = MyObject.objects.all()

# I think this is the optimal solution. 

qs = qs.extra(select={
              'case_number_int': "Cast(F('case_number'), IntegerField()))"
    })

now you can perform an order by on this. for example qs = qs.order_by('case_number_int')

Related