django 1.5中的原始查询不适用于desc的顺序

时间:2014-02-07 11:22:46

标签: django sql-order-by models

from project.models import Employees
sorting_field = 'name'
emps = Employees.objects.raw('SELECT * FROM employees where deleted=0 order by %s desc limit 5', [sorting_field])

这不会按降序获得记录的顺序。

3 个答案:

答案 0 :(得分:1)

通过order by %s参数向param提供.raw()的值不起作用,因为所有参数都被数据库后端转义。因此,您最终会得到order by 'name'(请注意引号)之类的查询,但这些查询无法正常工作。

或者,您可以使用字符串格式(which the Django docs strongly and rightely so advise against),但如果您不使用它来将用户生成的输入放入查询中,那么您应该没问题:

if condition:
    sort_field = 'name'
else:
    sort_field = 'id'

query = 'SELECT * FROM employees WHERE deleted = 0 ORDER BY {} DESC LIMIT 5'
params = {…}  # other parameters that need regular escaping
emps = Employees.objects.raw(query.format(sort_field), params)

答案 1 :(得分:0)

order_by只是QuerySet对象的方法,而不是RawQuerySet。这是在django orm中使用Raw obeject的限制之一

答案 2 :(得分:-1)

为什么使用原始查询来完成如此简单的任务? 试试这个:

Employees.objects.filter(deleted=0).order_by('-name')[:5]