Django / python: перебрать словарь и добавить в него элемент - PullRequest
1 голос
/ 24 мая 2011

Извиняюсь за возможно простой вопрос, я прочитал документы и до сих пор не могу заставить это работать.

Я делаю необработанный SQL-запрос в Django, который длинный, поэтому я не буду его публиковатьздесь - достаточно сказать, что он работает и возвращает результаты.

Я хочу просмотреть все результаты моего запроса и проверить, имеет ли название группы формат «The [band]», и переписать его в «[группа].Я знаю, что мог бы сделать это с помощью SQL, но производительность невелика для большого количества строк, и у меня есть функция на ленточной модели для такой сортировки, но я не могу использовать ее вместе с необработанным SQL-запросом..

Вот мой код:

m = Media.objects.raw('SELECT blah FROM foo')

for index, item in enumerate(m):
        if item.bandname_alt:
            if item.bandname_alt[:4] == 'The ':
                m[index].bandname_sortable = item.bandname_alt[4:] + ', The'

Я знаю, что логика работает и находит нужные полосы, но не могу понять, как добавить поле bandname_sortable в словарь так,Я могу получить к нему доступ в своих взглядах.

Может кто-нибудь помочь мне здесь?

Ответы [ 2 ]

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

Во-первых, избегайте необработанных SQL-запросов.Они редко нужны.Однако это отдельный вопрос.

У вас есть два способа подправить свои результаты.

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

class Media( models.Model ):
    @property
    def clean_band_name( self ):
        if self.bandname_alt[:4] == 'The ':
            return self.bandname_alt[4:] + ', The'
        else:
            return self.bandname_alt

Вы можете использовать sorted( list(results), key=lambda x: x.clean_band_name() )

ВView .Создайте простой список кортежей или список именованных кортежей с расширенными результатами.

data = [ (cleanup(item.bandname_alt), item) for item in m ]

Поскольку данные являются простой последовательностью, их можно отсортировать по первому элементу в каждом кортеже.

data.sort()
0 голосов
/ 25 мая 2011

Полагаю, как вы упомянули, у вас есть веская причина для необработанного запроса.Это нормально, возможно, вы можете создать экземпляр объекта Media для каждого взаимодействия, загрузить свой PK, установить значения и запустить .save ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...