【问题标题】:Reordering Modified QuerySet对修改后的查询集重新排序
【发布时间】:2011-05-17 20:19:54
【问题描述】:

我的数据库设置有一个案例列表,其中包含来自我们的票务系统的 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 列表似乎是唯一可行的方法。

【问题讨论】:

    标签: python django sorting django-queryset


    【解决方案1】:

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

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

    assigned_tech 字段排序。

    【讨论】:

    • 不幸的是,这将与 order_by 完全相同,并忽略新值。
    【解决方案2】:

    也许你在说 django 的 ORM 的order_by 方法

    【讨论】:

    • order_by 适用于原始查询。但是如果我们在修改值后运行它,它似乎不能正常工作。
    • 你如何“修改”查询的值?
    • 然后如何再次运行查询集?
    • 我们会尝试在 for 循环之后通过 current_active.order_by('assigned_tech') 来 order_by
    • 我假设您没有使用交易或类似的东西,对吧?
    【解决方案3】:

    不确定如何根据新属性对同一个 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)
    

    但是,如果您能找到一种无需创建新列表的方法,那显然会更好,我很乐意看到它。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 2015-10-26
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 2020-10-04
      相关资源
      最近更新 更多