通过整数来获取数据顺序而不是按数字的每个数字排序

时间:2014-01-07 17:03:04

标签: python mysql django django-queryset

当我在mysql查询中使用ORDER BY时,它按数字的每个数字排序。

例如:在我的查询中使用正常的ORDER BY我得到了这个结果

101, 103, 104, 105, 12, 123, 125, 13, 131, 134

但我的要求是我应该得到这样的结果:

12, 13, 101, 103, 104, 105, 123, 125, 131, 134

我们怎么能在mysql查询中做到这一点。

Django查询示例:

Foo.objects.filter(                                 
    Q(m_number__icontains=(request.GET['term']))
).filter(
    co_id = co_id,
    is_active=1
).values(
    'pk',
    'm_name',
    'm_number'
).order_by(
     'm_number'
)

我如何在这里使用额外的?顺序应该适用于m_number列。

2 个答案:

答案 0 :(得分:2)

您的数据很可能存储为文本而非数字。如果要强制执行正确的订单,可以使用... ORDER BY CAST(the_column AS UNSIGNED)。但更好的解决方案最有可能只是转换列本身的类型。

答案 1 :(得分:1)

我同意viraptor的答案。

我假设你可以在Django中使用额外的:

Foo.objects.extra(select={ 'd_field' : 'cast(the_column AS UNSIGNED)' }).extra(order_by=['d_field'])

但是viraptor是对的,最好转换列本身的类型(否则,无论何时使用模型,你都必须记住相同的“hack”)

最终条款应如下所示:

Foo.objects.filter( 
    Q(m_number__icontains=(request.GET['term'])) 
).filter( 
    co_id = co_id, 
    is_active=1 
).extra( 
    select={ 
        'int_m_number': 'cast(m_number AS UNSIGNED)', 
        'pk': 'pk' , 
        'm_number': 'm_number'
    } 
).extra( 
    order_by=['int_m_number'] 
)