重新排序修改后的QuerySet

时间:2011-05-17 20:19:55

标签: python django sorting django-queryset

我的数据库设置了一个案例列表,其中包含来自我们的票务系统的ID,一个位置,一个指定人员以及从该票证中获取的简短描述:

  • 案例
    • ID
    • 位置
    • 指定人员
    • 简短说明
    • 状态

现在为了更好地排序,根据某些状态值,我们在查询后更改QuerySet。

current_active = Case.objects.filter(queue_num=0,status__lt=6)
for item in current_active:
    if(item.location == 'NPH'):
        item.assigned_tech = 'NPH'
    elif(item.location == 'Bins'):
        item.assigned_tech = 'Bins'
    elif(item.status > '2' and item.status < '6'):
        item.assigned_tech = 'Pending'

我想知道是否有任何方法可以对这个新修改的QuerySet进行排序。我们知道它打印正确,它只是归结为混乱的排序。

更新2

current_active = Case.objects.filter(queue_num=0,status__lt=6)
current_active_list = []
for item in current_active:
    number = item.id
    item.id = '%07d' % number
    phone = item.myneuname.phonenumber
    if(len(phone) > 7):
        formattedPhone = phone[:-10]+' ('+phone[-10:-7]+') '+phone[-7:-4]+'-'+phone[-4:]
        item.myneuname.phonenumber = formattedPhone
    if(item.location == 'NPH'):
        item.assigned_tech = 'NPH'
    elif(item.location == 'Bins'):
        item.assigned_tech = 'Bins'
    elif(item.status > '2' and item.status < '6'):
        item.assigned_tech = 'Pending'
    current_active_list.append(item)
current_active_list.sort(key=lambda x: x.assigned_tech)

虽然这不是想法和Django风格,但这确实有效。如果您遇到同样的问题并找到更合理的方法来解决此问题,请随时回复。在不保存数据的情况下,制作Python列表似乎是唯一可行的方法。

3 个答案:

答案 0 :(得分:2)

由于您正在评估查询集,然后在不保存的情况下修改某些元素,因此您需要避免任何返回数据库并重新评估它的内容。在您的情况下,简单地在Python中排序列表没有任何问题 - 例如:

current_active.sort(key=lambda x: x.assigned_tech)

assigned_tech字段排序。

答案 1 :(得分:1)

也许你在谈论django的ORM的order_by方法

答案 2 :(得分:0)

不确定如何根据新属性对相同的QuerySet进行排序,但如果要将每个item附加到新列表中(在为每个项目分配assigned_tech之后),您可以执行此操作像这样的东西:

import operator
new_list.sort(key=operator.attrgetter('assigned_tech'))

并改变排序顺序:

import operator
new_list.sort(key=operator.attrgetter('assigned_tech'), reverse=True)

但是如果你找到一种方法可以在不创建新列表的情况下做到这一点,那显然会更好,我很乐意看到它。