Изменение порядка модифицированных QuerySet - PullRequest
0 голосов
/ 18 мая 2011

Моя база данных настроена со списком дел с идентификатором из нашей системы продажи билетов, местоположением, назначенным лицом и кратким описанием, взятым из билета:

  • Case
    • 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)

Хотя это не идея и не стиль Джанго, это работает. Если у вас возникла та же проблема и вы нашли более разумный способ ее устранения, не стесняйтесь отвечать. Создание списка Python казалось единственно возможным способом без сохранения данных.

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Поскольку вы оцениваете набор запросов, а затем изменяете некоторые элементы без сохранения, вам нужно избегать всего, что возвращается в базу данных и переоценивает ее. В вашем случае нет ничего плохого в простом упорядочивании списка в Python, например:

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

для сортировки по полю assigned_tech.

1 голос
/ 18 мая 2011

Может быть, вы говорите о order_by методе ORM Джанго

0 голосов
/ 18 мая 2011

Не уверен, как бы вы отсортировали тот же 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)

Но если вы найдете способ сделать это, не создавая новый список, это, очевидно, будет лучше, и мне бы очень хотелось это увидеть.

...